跳到正文
原文
Hacker News· lisajaloza·· 4 小时前精选AI 评分45

微软推出 Microsoft-Decision-1 决策评分模型,已上线 Microsoft Foundry

Microsoft-Decision-1, our model for fast decision-making

AI 导读

微软推出 Microsoft-Decision-1 决策评分模型,主打低延迟结构化决策任务,并已在 Microsoft Foundry 上线、即将在 OpenRouter 提供。

推荐理由

原文给出了与 LLM 和同类决策模型的延迟与准确率对比,读者可以据此判断该模型在路由、分类等高频决策环节的替换价值。

正文

Skip to main content

Skip to main content

Image 1: Microsoft

Source

Our Company

Signal blogOfficial Microsoft BlogCommand LineMicrosoft On The IssuesAsiaCanadaEurope, Middle East and AfricaLatin AmericaThe Code of Us

What's newAIInnovationDigital TransformationSustainabilitySecurityWork & LifeDiversity & InclusionUnlocked

More

Our CompanySignal blogOfficial Microsoft BlogCommand LineMicrosoft On The IssuesAsiaCanadaEurope, Middle East and AfricaLatin AmericaThe Code of Us

What's newAIInnovationDigital TransformationSustainabilitySecurityWork & LifeDiversity & InclusionUnlocked

All Microsoft

Software

PCs & Devices

Entertainment

Business

Developer & IT

Other

View Sitemap

Cancel

Search

Image 2

By builders, for builders.

A Microsoft publication

Search articles

Image 3

Deep Dive

Share

inrxf

Introducing Microsoft-Decision-1, our model for fast decision-making

Introducing Microsoft-Decision-1, our model for fast decision-making

Our new decision-scoring model delivers top performance in latency and quality on structured decision tasks to outperform both LLMs and other decision models.

By Achint SrivastavaVP of Software Engineering, Office of the CTO, Microsoft

2026.10.09

Decision models are quickly emerging as an important new category in AI. Unlike LLMs, which are designed to generate text or reason through complex problems, decision models are purpose-built to deliver structured outputs that software can immediately act on. And once you understand that capability—making decisions and classifying things at very low cost with high performance—all kinds of useful tasks get unlocked.

Today we’re introducing Microsoft-Decision-1, our new model for fast decision-scoring, available in Microsoft Foundry and coming soon through OpenRouter. This model is designed for routing, classification, prioritization, verification, and workflow control, making it easier to incorporate decision intelligence into existing applications, agents, and workflows in a secure, trusted environment. Microsoft-Decision-1 delivers top performance in latency and quality on structured decision tasks to outperform both LLMs and other decision models.

Microsoft-Decision-1 achieved the highest accuracy in our 36-benchmark comparison, spanning nearly 150,000 questions across benchmarks kept blind from training. And in our benchmarking, it was the fastest measured: 4.5 times quicker than Quyet-1.0-Large, the runner-up, and 35 times quicker than GPT-6 Sol.

PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIgY29udGVudD0iZGVmYXVsdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJyAndW5zYWZlLWV2YWwnOyBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnOyBpbWctc3JjIGRhdGE6IGJsb2I6IGh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3VwbG9hZHMvOyBmb250LXNyYyBkYXRhOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb207IG1lZGlhLXNyYyBkYXRhOiBibG9iOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC91cGxvYWRzLzsiPg0KPG1ldGEgY2hhcnNldD0idXRmLTgiPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4NCjx0aXRsZT5BY2N1cmFjeSwgbGF0ZW5jeSwgYW5kIGNhbGlicmF0aW9uPC90aXRsZT4NCjxzdHlsZT4NCkBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1Cb29rLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLU1lZGl1bS5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1Cb2xkLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLUl0YWxpYy5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IkNhc2NhZGlhIENvZGUiO2ZvbnQtd2VpZ2h0OjIwMCA3MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvQ2FzY2FkaWFDb2RlLndvZmYyIikgZm9ybWF0KCJ3b2ZmMiIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJDYXNjYWRpYSBDb2RlIjtmb250LXdlaWdodDoyMDAgNzAwO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL0Nhc2NhZGlhQ29kZUl0YWxpYy53b2ZmMiIpIGZvcm1hdCgid29mZjIiKTt9DQo6cm9vdCB7DQogIC0tYmc6ICNmZmY7DQogIC0taW5rOiAjMDAwOw0KICAtLW11dGVkOiAjNTU1Ow0KICAtLWZhaW50OiAjYzljOWM5OyAgICAgICAgLyogc2Vjb25kYXJ5IHNlcmllcyAqLw0KICAtLWdvb2Q6ICNFM0Y2NzE7ICAgICAgICAgLyogcHJpbWFyeSBtb2RlbCAoc2l0ZSBhY2NlbnQgbGltZSkgKi8NCiAgLS1iYWQ6ICNGRkEwMzc7ICAgICAgICAgIC8qIHByaW1hcnkgbW9kZWwgYmVoaW5kIChzaXRlIGFjY2VudCBvcmFuZ2UpICovDQogIC0tcnVsZTogIzAwMDsNCiAgLS1ydWxlLXNvZnQ6ICNlNmU2ZTY7DQogIC0taG92ZXI6ICNmM2YzZjM7DQogIC0tYmFkZ2UtYmc6ICMwMDA7DQogIC0tYmFkZ2UtZmc6ICNmZmY7DQogIC0tdGlwLWJnOiAjMDAwOw0KICAtLXRpcC1mZzogI2ZmZjsNCiAgLS1zYW5zOiAiUFAgTmV1ZSBNb250cmVhbCIsIHNhbnMtc2VyaWY7DQogIC0tbW9ubzogIkNhc2NhZGlhIENvZGUiLCB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgIkxpYmVyYXRpb24gTW9ubyIsIG1vbm9zcGFjZTsNCn0NCmh0bWxbZGF0YS10aGVtZT0iZGFyayJdIHsNCiAgLS1iZzogIzExMTsNCiAgLS1pbms6ICNmZmY7DQogIC0tbXV0ZWQ6ICM5OTk7DQogIC0tZmFpbnQ6ICM0NDQ7DQogIC0tcnVsZTogI2ZmZjsNCiAgLS1ydWxlLXNvZnQ6ICMyYTJhMmE7DQogIC0taG92ZXI6ICMxZjFmMWY7DQogIC0tYmFkZ2UtYmc6ICNmZmY7DQogIC0tYmFkZ2UtZmc6ICMxMTE7DQogIC0tdGlwLWJnOiAjZmZmOw0KICAtLXRpcC1mZzogIzExMTsNCn0NCg0KKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0NCmJvZHkgew0KICBtYXJnaW46IDA7DQogIGJhY2tncm91bmQ6IHZhcigtLWJnKTsNCiAgY29sb3I6IHZhcigtLWluayk7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1zYW5zKTsNCiAgZm9udC1zaXplOiAxNXB4Ow0KICBsaW5lLWhlaWdodDogMS40NTsNCiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7DQp9DQoud3JhcCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogMnB4IDAgNnB4OyB9DQoubnVtIHsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOyB9DQouayB7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC1zaXplOiAxMXB4Ow0KICBsZXR0ZXItc3BhY2luZzogMC4wNmVtOw0KICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOw0KICBjb2xvcjogdmFyKC0tbXV0ZWQpOw0KfQ0KYnV0dG9uIHsgZm9udDogaW5oZXJpdDsgY29sb3I6IGluaGVyaXQ7IGJhY2tncm91bmQ6IG5vbmU7IGJvcmRlcjogMDsgcGFkZGluZzogMDsgY3Vyc29yOiBwb2ludGVyOyB9DQpidXR0b246Zm9jdXMtdmlzaWJsZSwgW3RhYmluZGV4XTpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWluayk7IG91dGxpbmUtb2Zmc2V0OiAycHg7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gSGVhZGVyID09PT09PT09PT09PT09PT09ICovDQouaGVhZCB7IG1hcmdpbi1ib3R0b206IDI4cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgfQ0KLmJhZGdlIHsNCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICBwYWRkaW5nOiA0cHggOHB4Ow0KICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWRnZS1iZyk7DQogIGNvbG9yOiB2YXIoLS1iYWRnZS1mZyk7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC1zaXplOiAxMHB4Ow0KICBsaW5lLWhlaWdodDogMTsNCiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsNCiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCn0NCmgxIHsNCiAgbWFyZ2luOiAxOHB4IDAgOHB4Ow0KICBmb250LXNpemU6IGNsYW1wKDI0cHgsIDQuMnZ3LCAzMnB4KTsNCiAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxNWVtOw0KICBsaW5lLWhlaWdodDogMS4xMjsNCn0NCi5zdWIgeyBtYXJnaW46IDAgYXV0bzsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMS41OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXgtd2lkdGg6IDYyY2g7IH0NCi5zdWIgLmRpciB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNTAwOyB9DQoNCi8qID09PT09PT09PT09PT09PT09IExlZ2VuZCAvIHRvZ2dsZXMgPT09PT09PT09PT09PT09PT0gKi8NCi5jb250cm9scyB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGZsZXgtd3JhcDogd3JhcDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICBnYXA6IDEwcHggMjRweDsNCiAgbWFyZ2luLWJvdHRvbTogMThweDsNCn0NCi5sZWdlbmQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNHB4IDZweDsgfQ0KLmxlZ2VuZCBidXR0b24sIC50b2dnbGUgYnV0dG9uIHsNCiAgZGlzcGxheTogaW5saW5lLWZsZXg7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIGdhcDogOHB4Ow0KICBwYWRkaW5nOiA1cHggMTFweDsNCiAgZm9udC1zaXplOiAxM3B4Ow0KICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ydWxlLXNvZnQpOw0KICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZSwgYmFja2dyb3VuZCAwLjE1cyBlYXNlLCBvcGFjaXR5IDAuMnMgZWFzZTsNCn0NCi5sZWdlbmQgYnV0dG9uOmhvdmVyLCAudG9nZ2xlIGJ1dHRvbjpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQ0KLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl0geyBib3JkZXItY29sb3I6IHZhcigtLWluayk7IGZvbnQtd2VpZ2h0OiA1MDA7IH0NCi5sZWdlbmQgLnN3IHsgd2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDsgZmxleDogMCAwIDEwcHg7IH0NCi5sZWdlbmQgLnN3LnByaSB7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyB9DQoubGVnZW5kIC5zdy5yZWYgeyBiYWNrZ3JvdW5kOiB2YXIoLS1pbmspOyB9DQoubGVnZW5kIC5zdy5vdGggeyBiYWNrZ3JvdW5kOiB2YXIoLS1mYWludCk7IH0NCi5sZWdlbmQuaXNvIGJ1dHRvbjpub3QoW2FyaWEtcHJlc3NlZD0idHJ1ZSJdKSB7IG9wYWNpdHk6IDAuNDU7IH0NCi5sZWdlbmQgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdOjphZnRlciB7IGNvbnRlbnQ6ICLCtyBjbGljayB0byBjbGVhciI7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi50b2dnbGUgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDRweDsgfQ0KLnRvZ2dsZSAuayB7IG1hcmdpbi1yaWdodDogOHB4OyB9DQoudG9nZ2xlIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXSB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IGNvbG9yOiB2YXIoLS1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBOb3RlcyAvIHNvdXJjZSA9PT09PT09PT09PT09PT09PSAqLw0KLm5vdGUgeyBtYXJnaW46IDE2cHggMCAwOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjU7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi5ub3RlIC5udW0geyBjb2xvcjogdmFyKC0taW5rKTsgfQ0KLnNvdXJjZSB7IG1hcmdpbi10b3A6IDMycHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tcnVsZS1zb2Z0KTsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS41NTsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLnNvdXJjZSBwIHsgbWFyZ2luOiAwIDAgNHB4OyB9DQoNCi8qID09PT09PT09PT09PT09PT09IFRvb2x0aXAgPT09PT09PT09PT09PT09PT0gKi8NCi50aXAgew0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIHotaW5kZXg6IDI7DQogIG1heC13aWR0aDogMzAwcHg7DQogIHBhZGRpbmc6IDEwcHggMTJweDsNCiAgYmFja2dyb3VuZDogdmFyKC0tdGlwLWJnKTsNCiAgY29sb3I6IHZhcigtLXRpcC1mZyk7DQogIGZvbnQtc2l6ZTogMTNweDsNCiAgbGluZS1oZWlnaHQ6IDEuNDsNCiAgcG9pbnRlci1ldmVudHM6IG5vbmU7DQogIG9wYWNpdHk6IDA7DQogIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xMnMgZWFzZTsNCn0NCi50aXAuc2hvdyB7IG9wYWNpdHk6IDE7IH0NCi50aXAgLnQgeyBmb250LXdlaWdodDogNTAwOyBtYXJnaW4tYm90dG9tOiA2cHg7IH0NCi50aXAgLnIgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogMTZweDsgfQ0KLnRpcCAuciArIC5yIHsgbWFyZ2luLXRvcDogMnB4OyB9DQoudGlwIC5yLmhpIHsgZm9udC13ZWlnaHQ6IDcwMDsgfQ0KLnRpcCAuci5oaSA+IHNwYW46Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4OyBtYXJnaW4tcmlnaHQ6IDhweDsgdmVydGljYWwtYWxpZ246IDFweDsgYmFja2dyb3VuZDogdmFyKC0tZ29vZCk7IH0NCi50aXAgLnIuaGkuYiA+IHNwYW46Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7IGJhY2tncm91bmQ6IHZhcigtLWJhZCk7IH0NCi50aXAgLnMgeyBtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmctdG9wOiA2cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tdGlwLWZnKSAyNSUsIHRyYW5zcGFyZW50KTsgZm9udC1zaXplOiAxMnB4OyBvcGFjaXR5OiAwLjg1OyB9DQoNCi8qID09PT09PT09PT09PT09PT09IE1vdGlvbiAoc2hhcmVkKSA9PT09PT09PT09PT09PT09PSAqLw0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7DQogIC5oZWFkIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IHRyYW5zaXRpb246IG9wYWNpdHkgMC41cyBlYXNlLCB0cmFuc2Zvcm0gMC41cyBlYXNlOyB9DQogIC5oZWFkLmluIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9DQp9DQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgew0KICAqIHsgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OyB9DQp9DQpAbWVkaWEgKG1heC13aWR0aDogNTYwcHgpIHsNCiAgLmhlYWQgeyBtYXJnaW4tYm90dG9tOiAyMnB4OyB9DQogIC5zdWIgeyBmb250LXNpemU6IDE1cHg7IH0NCiAgLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl06OmFmdGVyIHsgY29udGVudDogIsK3IHRhcCB0byBjbGVhciI7IH0NCn0NCg0KLnNvdXJjZSBzdHJvbmcgeyBjb2xvcjogdmFyKC0taW5rKTsgZm9udC13ZWlnaHQ6IDcwMDsgfQ0KLmJmIHsgLS1uYW1lLXc6IDIwMHB4OyAtLWNhbC13OiAxNTBweDsgLS1nYXA6IDE2cHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQ0KLmNvbHMgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIHZhcigtLW5hbWUtdykgbWlubWF4KDAsIDFmcikgdmFyKC0tY2FsLXcpOyBnYXA6IDAgdmFyKC0tZ2FwKTsgfQ0KLmhkciB7IG1hcmdpbi1ib3R0b206IDEwcHg7IGFsaWduLWl0ZW1zOiBlbmQ7IH0NCi5oZHIgLmsgeyBsaW5lLWhlaWdodDogMS4zNTsgfQ0KLmhkciAubCB7IHRleHQtYWxpZ246IHJpZ2h0OyB9DQouaGRyIC5jIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9DQouaGRyIC5kaXIgeyBkaXNwbGF5OiBibG9jazsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IGxldHRlci1zcGFjaW5nOiAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDExcHg7IH0NCg0KLmxpbmVzLCAuYmFzZXMgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0NCi5saW5lcyB7IHotaW5kZXg6IDA7IH0gLmJhc2VzIHsgei1pbmRleDogMjsgfQ0KLmxpbmVzIC5zaWRlLCAuYmFzZXMgLnNpZGUgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH0NCi5nbCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiAxcHg7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUtc29mdCk7IH0NCi5nbC5iYXNlIHsgYmFja2dyb3VuZDogdmFyKC0tcnVsZSk7IH0NCi5zaWRlLmwgLmdsIHsgcmlnaHQ6IHZhcigtLXApOyB9DQouc2lkZS5yIC5nbCwgLnNpZGUuYyAuZ2wgeyBsZWZ0OiB2YXIoLS1wKTsgfQ0KDQoucm93cyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfQ0KLnJvdyB7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDhweCAwOyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tcnVsZS1zb2Z0KTsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7IH0NCi5yb3c6bGFzdC1jaGlsZCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ydWxlLXNvZnQpOyB9DQoucm93OmhvdmVyLCAucm93LmhvdCB7IGJhY2tncm91bmQ6IHZhcigtLWhvdmVyKTsgfQ0KLnJvdzpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWluayk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9DQoubmFtZSB7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMS4yOyB9DQoubmFtZSBzbWFsbCB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tdG9wOiAycHg7IGZvbnQ6IDEwLjVweCB2YXIoLS1tb25vKTsgY29sb3I6IHZhcigtLW11dGVkKTsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgfQ0KDQouY2VsbCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgaGVpZ2h0OiAyMnB4OyAtLWM6IHZhcigtLWZhaW50KTsgfQ0KLnJvdy5wcmkgLmNlbGwgeyAtLWM6IHZhcigtLWdvb2QpOyB9DQoucm93LnJlZiAuY2VsbC5yIHsgLS1jOiB2YXIoLS1pbmspOyB9DQoudHJhY2sgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgYm90dG9tOiAwOyB3aWR0aDogdmFyKC0tdyk7IGJhY2tncm91bmQ6IHZhcigtLWMpOyB9DQouY2VsbC5sIC50cmFjayB7IHJpZ2h0OiAwOyB0cmFuc2Zvcm0tb3JpZ2luOiAxMDAlIDUwJTsgfQ0KLmNlbGwuciAudHJhY2sgeyBsZWZ0OiAwOyB0cmFuc2Zvcm0tb3JpZ2luOiAwIDUwJTsgfQ0KLnJvdy5wcmkgLmNlbGwuciAudHJhY2sucDk1IHsgbGVmdDogdmFyKC0tdzApOyB3aWR0aDogY2FsYyh2YXIoLS13KSAtIHZhcigtLXcwKSk7IGJhY2tncm91bmQ6IHJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1nb29kKSAwIDNweCwgdHJhbnNwYXJlbnQgM3B4IDZweCk7IH0NCi52YWwgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IGZvbnQ6IDEyLjVweCB2YXIoLS1tb25vKTsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgY29sb3I6IHZhcigtLWluayk7IH0NCi5jZWxsLmwgLnZhbCB7IHJpZ2h0OiBjYWxjKHZhcigtLXcpICsgOHB4KTsgfQ0KLmNlbGwuciAudmFsIHsgbGVmdDogY2FsYyh2YXIoLS13KSArIDhweCk7IH0NCi52YWwgLnByZSB7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi8qIGxhYmVsIG1vdmVzIGluc2lkZSB0aGUgYmFyIHdoZW4gaXQgd291bGQgc3BpbGwgcGFzdCB0aGUgZWRnZSAobWVhc3VyZWQgYXQgcnVudGltZSkgKi8NCi5jZWxsLmwgLnZhbC5pbiB7IHJpZ2h0OiBhdXRvOyBsZWZ0OiBjYWxjKDEwMCUgLSB2YXIoLS13KSArIDhweCk7IGNvbG9yOiB2YXIoLS1pbmspOyB9DQouY2VsbC5yIC52YWwuaW4geyBsZWZ0OiBhdXRvOyByaWdodDogY2FsYygxMDAlIC0gdmFyKC0tdykgKyA4cHgpOyBjb2xvcjogdmFyKC0taW5rKTsgfQ0KLnJvdy5yZWYgLmNlbGwuciAudmFsLmluIHsgY29sb3I6IHZhcigtLWJnKTsgfQ0KLnJvdy5yZWYgLmNlbGwuciAudmFsLmluIC5wcmUgeyBjb2xvcjogdmFyKC0tYmcpOyBvcGFjaXR5OiAwLjc7IH0NCi5ub25lIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOyBmb250OiAxMS41cHggdmFyKC0tbW9ubyk7IGxldHRlci1zcGFjaW5nOiAwLjAyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCi5jZWxsLmwgLm5vbmUgeyByaWdodDogOHB4OyB9DQouY2VsbC5yIC5ub25lLCAuY2VsbC5jIC5ub25lIHsgbGVmdDogOHB4OyB9DQoNCi8qIGNhbGlicmF0aW9uOiBkb3Qgb24gYW4gODAtMTAwIHRyYWNrICovDQouY2VsbC5jIC5zdGVtIHsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyB0b3A6IDUwJTsgd2lkdGg6IHZhcigtLXcpOyBoZWlnaHQ6IDJweDsgbWFyZ2luLXRvcDogLTFweDsgYmFja2dyb3VuZDogdmFyKC0tcnVsZS1zb2Z0KTsgdHJhbnNmb3JtLW9yaWdpbjogMCA1MCU7IH0NCi5yb3cucHJpIC5jZWxsLmMgLnN0ZW0geyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kKTsgfQ0KLmNlbGwuYyAuZG90IHsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiB2YXIoLS13KTsgdG9wOiA1MCU7IHdpZHRoOiAxMnB4OyBoZWlnaHQ6IDEycHg7IG1hcmdpbjogLTZweCAwIDAgLTZweDsgYm9yZGVyLXJhZGl1czogNTAlOyBiYWNrZ3JvdW5kOiB2YXIoLS1jKTsgfQ0KLnJvdy5wcmkgLmNlbGwuYyAuZG90IHsgYm94LXNoYWRvdzogMCAwIDAgMnB4IHZhcigtLWluayk7IH0NCi5jZWxsLmMgLnZhbCB7IGxlZnQ6IGNhbGModmFyKC0tdykgKyAxMnB4KTsgfQ0KLmNlbGwuYyAudmFsLmluIHsgbGVmdDogYXV0bzsgcmlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXcpICsgMTBweCk7IHBhZGRpbmc6IDAgM3B4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IH0NCi5yb3c6aG92ZXIgLmNlbGwuYyAudmFsLmluLCAucm93LmhvdCAuY2VsbC5jIC52YWwuaW4geyBiYWNrZ3JvdW5kOiB2YXIoLS1ob3Zlcik7IH0NCg0KLmF4aXMgeyBtYXJnaW4tdG9wOiA4cHg7IH0NCi5heGlzIC5zaWRlIHsgcG9zaXRpb246IHJlbGF0aXZlOyBoZWlnaHQ6IDE2cHg7IH0NCi50ayB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBmb250OiAxMXB4IHZhcigtLW1vbm8pOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IH0NCi5zaWRlLmwgLnRrIHsgcmlnaHQ6IHZhcigtLXApOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNTAlKTsgfQ0KLnNpZGUuciAudGssIC5zaWRlLmMgLnRrIHsgbGVmdDogdmFyKC0tcCk7IH0NCi5zaWRlLmwgLnRrLmVkZ2UgeyByaWdodDogYXV0bzsgbGVmdDogMDsgdHJhbnNmb3JtOiBub25lOyB9DQouc2lkZS5yIC50ay5lZGdlIHsgdHJhbnNmb3JtOiBub25lOyB9DQouc2lkZS5jIC50ay5lZGdlIHsgbGVmdDogYXV0bzsgcmlnaHQ6IDA7IHRyYW5zZm9ybTogbm9uZTsgfQ0KDQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpIHsNCiAgLnJldmVhbCAudHJhY2ssIC5yZXZlYWwgLnN0ZW0geyB0cmFuc2Zvcm06IHNjYWxlWCgwKTsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuN3MgY3ViaWMtYmV6aWVyKDAuMiwgMC43LCAwLjIsIDEpOyB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWkpICogNDVtcyArIDE1MG1zKTsgfQ0KICAucmV2ZWFsLmluIC50cmFjaywgLnJldmVhbC5pbiAuc3RlbSB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICAucmV2ZWFsIC5kb3QgeyB0cmFuc2Zvcm06IHNjYWxlKDApOyB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zNXMgY3ViaWMtYmV6aWVyKDAuMiwgMC44LCAwLjIsIDEuMyk7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSkgKiA0NW1zICsgNjUwbXMpOyB9DQogIC5yZXZlYWwuaW4gLmRvdCB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICAucmV2ZWFsIC52YWwgeyBvcGFjaXR5OiAwOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNHMgZWFzZTsgdHJhbnNpdGlvbi1kZWxheTogY2FsYyh2YXIoLS1pKSAqIDQ1bXMgKyA2MDBtcyk7IH0NCiAgLnJldmVhbC5pbiAudmFsIHsgb3BhY2l0eTogMTsgfQ0KICAucmV2ZWFsLnNldHRsZWQgLnRyYWNrLCAucmV2ZWFsLnNldHRsZWQgLnN0ZW0sIC5yZXZlYWwuc2V0dGxlZCAuZG90LCAucmV2ZWFsLnNldHRsZWQgLnZhbCB7IHRyYW5zaXRpb24tZGVsYXk6IDBzOyB9DQogIC5yb3cuZmxpcCB7IHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjU1cyBjdWJpYy1iZXppZXIoMC4yLCAwLjcsIDAuMiwgMSksIGJhY2tncm91bmQgMC4xNXMgZWFzZTsgfQ0KfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDEwMDBweCkgeyAuYmYgeyAtLW5hbWUtdzogMTcwcHg7IC0tY2FsLXc6IDEyMHB4OyB9IC5uYW1lIHsgZm9udC1zaXplOiAxMy41cHg7IH0gfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDc2MHB4KSB7IC5iZiB7IC0tbmFtZS13OiAxNDBweDsgLS1jYWwtdzogOTZweDsgLS1nYXA6IDEycHg7IH0gLnZhbCB7IGZvbnQtc2l6ZTogMTJweDsgfSAudmFsIC5wcmUgeyBkaXNwbGF5OiBub25lOyB9IC5ub25lIHsgZm9udC1zaXplOiAxMC41cHg7IH0gLnRrLm0geyBkaXNwbGF5OiBub25lOyB9IH0NCkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkgew0KICAuY29scyB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDAsIDFmcikgbWlubWF4KDAsIDFmcik7IGdhcDogMCAxNHB4OyB9DQogIC5oZHIgLmMsIC5oZHIgLmNjLCAuYXhpcyAuc2lkZS5jLCAubGluZXMgPiBkaXY6bnRoLWNoaWxkKDIpLCAuYmFzZXMgPiBkaXY6bnRoLWNoaWxkKDIpLCAuYXhpcyA+IGRpdjpudGgtY2hpbGQoMikgeyBkaXNwbGF5OiBub25lOyB9DQogIC5oZHIgLmwsIC5oZHIgLnIgeyBmb250LXNpemU6IDEwcHg7IH0NCiAgLnJvdyB7IHBhZGRpbmc6IDEwcHggMDsgfQ0KICAubmFtZSB7IGdyaWQtY29sdW1uOiAxIC8gLTE7IG9yZGVyOiAtMTsgdGV4dC1hbGlnbjogbGVmdDsgbWFyZ2luLWJvdHRvbTogNnB4OyB9DQogIC5uYW1lIHNtYWxsIHsgZGlzcGxheTogaW5saW5lOyBtYXJnaW4tbGVmdDogOHB4OyB9DQogIC5jZWxsIHsgaGVpZ2h0OiAxOHB4OyB9DQogIC5jZWxsLmMgeyBncmlkLWNvbHVtbjogMSAvIC0xOyBtYXJnaW4tdG9wOiA4cHg7IGhlaWdodDogMTZweDsgLS1pbnM6IDk2cHg7IH0NCiAgLmNlbGwuYzo6YmVmb3JlIHsgY29udGVudDogImNhbGlicmF0aW9uIjsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyB0b3A6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOyBmb250OiAxMHB4IHZhcigtLW1vbm8pOyBsZXR0ZXItc3BhY2luZzogMC4wNmVtOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9DQogIC5jZWxsLmMgLnN0ZW0geyBsZWZ0OiB2YXIoLS1pbnMpOyB3aWR0aDogY2FsYygoMTAwJSAtIHZhcigtLWlucykpICogdmFyKC0tZikpOyB9DQogIC5jZWxsLmMgLmRvdCB7IGxlZnQ6IGNhbGModmFyKC0taW5zKSArICgxMDAlIC0gdmFyKC0taW5zKSkgKiB2YXIoLS1mKSk7IH0NCiAgLmNlbGwuYyAudmFsLCAuY2VsbC5jIC52YWwuaW4geyByaWdodDogYXV0bzsgbGVmdDogY2FsYyh2YXIoLS1pbnMpICsgKDEwMCUgLSB2YXIoLS1pbnMpKSAqIHZhcigtLWYpICsgMTJweCk7IH0NCiAgLmNlbGwuYyAubm9uZSB7IGxlZnQ6IHZhcigtLWlucyk7IH0NCiAgLmxpbmVzLCAuYmFzZXMgLnNpZGUuYyB7IGRpc3BsYXk6IG5vbmU7IH0NCiAgLnZhbCB7IGZvbnQtc2l6ZTogMTEuNXB4OyB9DQogIC5ub25lIHsgZm9udC1zaXplOiAxMHB4OyB9DQp9DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQo8ZGl2IGNsYXNzPSJ3cmFwIiBpZD0icm9vdCI+DQogIDxoZWFkZXIgY2xhc3M9ImhlYWQiPg0KICAgIA0KICAgIDxoMT5BY2N1cmFjeSwgbGF0ZW5jeSwgYW5kIGNhbGlicmF0aW9uLCBzaWRlIGJ5IHNpZGU8L2gxPg0KICAgIA0KICA8L2hlYWRlcj4NCg0KICA8ZGl2IGNsYXNzPSJjb250cm9scyI+DQogICAgPGRpdiBjbGFzcz0ibGVnZW5kIiByb2xlPSJsaXN0IiBhcmlhLWxhYmVsPSJLZXkiPg0KICAgICAgPHNwYW4gY2xhc3M9ImJ0biIgcm9sZT0ibGlzdGl0ZW0iIHN0eWxlPSJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O3BhZGRpbmc6NXB4IDA7bWFyZ2luLXJpZ2h0OjEwcHg7Zm9udC1zaXplOjEzcHgiPjxzcGFuIGNsYXNzPSJzdyBwcmkiPjwvc3Bhbj5NaWNyb3NvZnQtRGVjaXNpb24tMTwvc3Bhbj4NCiAgICAgIDxzcGFuIGNsYXNzPSJidG4iIHJvbGU9Imxpc3RpdGVtIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDtwYWRkaW5nOjVweCAwO21hcmdpbi1yaWdodDoxMHB4O2ZvbnQtc2l6ZToxM3B4Ij48c3BhbiBjbGFzcz0ic3cgcmVmIj48L3NwYW4+R1BULTYgU29sIChyZWZlcmVuY2UpPC9zcGFuPg0KICAgICAgPHNwYW4gY2xhc3M9ImJ0biIgcm9sZT0ibGlzdGl0ZW0iIHN0eWxlPSJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O3BhZGRpbmc6NXB4IDA7Zm9udC1zaXplOjEzcHgiPjxzcGFuIGNsYXNzPSJzdyBvdGgiPjwvc3Bhbj5PdGhlciBtb2RlbHM8L3NwYW4+DQogICAgPC9kaXY+DQogICAgPGRpdiBjbGFzcz0idG9nZ2xlIiByb2xlPSJncm91cCIgYXJpYS1sYWJlbD0iU29ydCByb3dzIiBpZD0ic29ydCI+DQogICAgICA8c3BhbiBjbGFzcz0iayI+U29ydCBieTwvc3Bhbj4NCiAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXM9ImFjYyIgYXJpYS1wcmVzc2VkPSJ0cnVlIj5BY2N1cmFjeTwvYnV0dG9uPg0KICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGRhdGEtcz0ibGF0IiBhcmlhLXByZXNzZWQ9ImZhbHNlIj5MYXRlbmN5PC9idXR0b24+DQogICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1zPSJjYWwiIGFyaWEtcHJlc3NlZD0iZmFsc2UiPkNhbGlicmF0aW9uPC9idXR0b24+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJiZiByZXZlYWwiIGlkPSJjaGFydCI+DQogICAgPGRpdiBjbGFzcz0iY29scyBoZHIiPg0KICAgICAgPGRpdiBjbGFzcz0iayBsIj5BdmVyYWdlIGFjY3VyYWN5PHNwYW4gY2xhc3M9ImRpciI+SGlnaGVyIGlzIGJldHRlciAmbWlkZG90OyAzNiBiZW5jaG1hcmtzPC9zcGFuPjwvZGl2Pg0KICAgICAgPGRpdiBjbGFzcz0iayBjIj5Nb2RlbDwvZGl2Pg0KICAgICAgPGRpdiBjbGFzcz0iayByIj5NZWRpYW4gbGF0ZW5jeTxzcGFuIGNsYXNzPSJkaXIiPkxvd2VyIGlzIGJldHRlciAmbWlkZG90OyBwZXIgcmVxdWVzdDwvc3Bhbj48L2Rpdj4NCiAgICAgIDxkaXYgY2xhc3M9ImsgY2MiPkNhbGlicmF0aW9uPHNwYW4gY2xhc3M9ImRpciI+MTAwID0gcGVyZmVjdDwvc3Bhbj48L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZSI+DQogICAgICA8ZGl2IGNsYXNzPSJjb2xzIGxpbmVzIiBpZD0ibGluZXMiIGFyaWEtaGlkZGVuPSJ0cnVlIj48ZGl2IGNsYXNzPSJzaWRlIGwiPjwvZGl2PjxkaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZSByIj48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlIGMiPjwvZGl2PjwvZGl2Pg0KICAgICAgPGRpdiBjbGFzcz0iY29scyBiYXNlcyIgaWQ9ImJhc2VzIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PGRpdiBjbGFzcz0ic2lkZSBsIj48L2Rpdj48ZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGUgciI+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZSBjIj48L2Rpdj48L2Rpdj4NCiAgICAgIDxkaXYgY2xhc3M9InJvd3MiIGlkPSJyb3dzIj48L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8ZGl2IGNsYXNzPSJjb2xzIGF4aXMiIGlkPSJheGlzIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PGRpdiBjbGFzcz0ic2lkZSBsIj48L2Rpdj48ZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGUgciI+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZSBjIj48L2Rpdj48L2Rpdj4NCiAgPC9kaXY+DQogIDxwIGNsYXNzPSJub3RlIj5NaWNyb3NvZnQtRGVjaXNpb24tMSBpcyBmaXJzdCBvbiBhY2N1cmFjeSBhbmQgdGhlIGZhc3Rlc3QgbWVhc3VyZWQ6IDxzcGFuIGNsYXNzPSJudW0iPjQuNSZ0aW1lczs8L3NwYW4+IHF1aWNrZXIgdGhhbiBRdXlldC0xLjAtTGFyZ2UsIHRoZSBydW5uZXItdXAsIGFuZCA8c3BhbiBjbGFzcz0ibnVtIj4zNSZ0aW1lczs8L3NwYW4+IHF1aWNrZXIgdGhhbiBHUFQtNiBTb2wuIFNlY29uZCBvbiBjYWxpYnJhdGlvbiwgPHNwYW4gY2xhc3M9Im51bSI+MC45PC9zcGFuPiBiZWhpbmQgUXV5ZXQuIEhvdmVyIG9yIHRhcCBhIHJvdyBmb3IgdGhlIGRldGFpbC48L3A+DQogIDxkaXYgY2xhc3M9InNvdXJjZSI+DQogICAgPHA+PHN0cm9uZz5BY2N1cmFjeTo8L3N0cm9uZz4gbWVhbiBzY29yZSBhY3Jvc3MgMzYgYmVuY2htYXJrcyAoMTQ3LDEzNyBxdWVzdGlvbnMpOyAjbiBpcyB0aGUgSmV2QmVuY2ggbGVhZGVyYm9hcmQgcG9zaXRpb24gb24gOCBPY3RvYmVyIDIwMjYuICoqIFN0cmFuZHMtRGVjaWRlciAyQjogYXZlcmFnZSBvZiB0aGUgMjMgb2YgMzYgYmVuY2htYXJrcyBpdCBjb3VsZCBhbnN3ZXIuPC9wPg0KICAgIDxwPjxzdHJvbmc+TGF0ZW5jeTo8L3N0cm9uZz4gSmV2QmVuY2ggdjEuNi4xIGFkanVzdGVkIG1lZGlhbiAocDUwKSwgY2hlY2tlZCBPY3QgNywgMjAyNi4gKiBNaWNyb3NvZnQtRGVjaXNpb24tMSBtZWFzdXJlZCB0aHJvdWdoIEZvdW5kcnkgaW4gdGhlIHNhbWUgcmVnaW9uLjwvcD4NCiAgICA8cD48c3Ryb25nPkNhbGlicmF0aW9uOjwvc3Ryb25nPiAxMDAgbWVhbnMgYSBtb2RlbCdzIGNvbmZpZGVuY2UgZXhhY3RseSBtYXRjaGVzIGhvdyBvZnRlbiBpdCBpcyByaWdodC4gJmxkcXVvO05vdCByYW5rZWQmcmRxdW87LCAmbGRxdW87bm90IG1lYXN1cmVkJnJkcXVvOyBhbmQgJmxkcXVvO25vdCBzY29yZWQmcmRxdW87IG1hcmsgbW9kZWxzIGFic2VudCBmcm9tIGEgZGF0YXNldC48L3A+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InRpcCIgaWQ9InRpcCIgcm9sZT0idG9vbHRpcCIgYXJpYS1oaWRkZW49InRydWUiPjwvZGl2Pg0KPC9kaXY+DQo8c2NyaXB0Pg0KKGZ1bmN0aW9uICgpIHsNCiAgdmFyIG1vdGlvbiA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSknKS5tYXRjaGVzOw0KICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290Jyk7DQogIHZhciB0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGlwJyk7DQoNCiAgZnVuY3Rpb24gZWwodGFnLCBjbHMsIHRleHQpIHsNCiAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsNCiAgICBpZiAoY2xzKSBuLmNsYXNzTmFtZSA9IGNsczsNCiAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkICYmIHRleHQgIT09IG51bGwpIG4udGV4dENvbnRlbnQgPSB0ZXh0Ow0KICAgIHJldHVybiBuOw0KICB9DQogIGZ1bmN0aW9uIHNldFZhcihuLCBrLCB2KSB7IG4uc3R5bGUuc2V0UHJvcGVydHkoaywgdik7IH0NCiAgZnVuY3Rpb24gZm10TihuLCBkKSB7IHJldHVybiBuLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGQgfSk7IH0NCg0KICAvLyAtLS0tIFRvb2x0aXAgKGhvdmVyLCBrZXlib2FyZCBmb2N1cyBhbmQgdGFwKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgdmFyIGhvdCA9IG51bGw7DQogIGZ1bmN0aW9uIHJlbmRlclRpcChzcGVjKSB7DQogICAgdGlwLmlubmVySFRNTCA9ICcnOw0KICAgIGlmIChzcGVjLnRpdGxlKSB0aXAuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICd0Jywgc3BlYy50aXRsZSkpOw0KICAgIChzcGVjLnJvd3MgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHIpIHsNCiAgICAgIHZhciByb3cgPSBlbCgnZGl2JywgJ3InICsgKHJbMl0gPyAnICcgKyByWzJdIDogJycpKTsNCiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIG51bGwsIHJbMF0pKTsNCiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdudW0nLCByWzFdKSk7DQogICAgICB0aXAuYXBwZW5kQ2hpbGQocm93KTsNCiAgICB9KTsNCiAgICBpZiAoc3BlYy5ub3RlKSB0aXAuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdzJywgc3BlYy5ub3RlKSk7DQogIH0NCiAgZnVuY3Rpb24gcGxhY2VUaXAobm9kZSwgcHJlZmVyKSB7DQogICAgdmFyIHJyID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICB2YXIgbnIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KICAgIHZhciB0dyA9IHRpcC5vZmZzZXRXaWR0aCwgdGggPSB0aXAub2Zmc2V0SGVpZ2h0Ow0KICAgIHZhciBsZWZ0ID0gbnIubGVmdCAtIHJyLmxlZnQgKyAocHJlZmVyID09PSAnYWJvdmUnID8gbnIud2lkdGggLyAyIC0gdHcgLyAyIDogMCk7DQogICAgbGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxlZnQsIHJyLndpZHRoIC0gdHcpKTsNCiAgICB2YXIgYmVsb3cgPSBuci5ib3R0b20gLSByci50b3AgKyA2Ow0KICAgIHZhciBhYm92ZSA9IG5yLnRvcCAtIHJyLnRvcCAtIHRoIC0gKHByZWZlciA9PT0gJ2Fib3ZlJyA/IDI2IDogNik7DQogICAgdmFyIHRvcDsNCiAgICBpZiAocHJlZmVyID09PSAnYWJvdmUnKSB0b3AgPSBhYm92ZSA+PSAwID8gYWJvdmUgOiBNYXRoLm1pbihiZWxvdywgcnIuaGVpZ2h0IC0gdGgpOw0KICAgIGVsc2UgdG9wID0gKGJlbG93ICsgdGggPD0gcnIuaGVpZ2h0KSA/IGJlbG93IDogTWF0aC5tYXgoMCwgYWJvdmUpOw0KICAgIC8vIFN0YXkgaW5zaWRlIHRoZSB3aWRnZXQgc28gdGhlIGF1dG8tc2l6ZWQgZnJhbWUgbmV2ZXIgY2xpcHMgdGhlIHRpcC4NCiAgICB0aXAuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnOw0KICAgIHRpcC5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCB0b3ApICsgJ3B4JzsNCiAgfQ0KICBmdW5jdGlvbiBzaG93VGlwKG5vZGUsIGJ1aWxkLCBwcmVmZXIpIHsNCiAgICBpZiAoaG90ID09PSBub2RlKSByZXR1cm47DQogICAgaGlkZVRpcCgpOw0KICAgIGhvdCA9IG5vZGU7DQogICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdob3QnKTsNCiAgICByZW5kZXJUaXAoYnVpbGQobm9kZSkpOw0KICAgIHRpcC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7DQogICAgdGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTsNCiAgICBwbGFjZVRpcChub2RlLCBwcmVmZXIpOw0KICB9DQogIGZ1bmN0aW9uIGhpZGVUaXAoKSB7DQogICAgaWYgKGhvdCkgaG90LmNsYXNzTGlzdC5yZW1vdmUoJ2hvdCcpOw0KICAgIGhvdCA9IG51bGw7DQogICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsNCiAgICB0aXAuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7DQogIH0NCiAgZnVuY3Rpb24gYmluZFRpcHMoc2VsZWN0b3IsIGJ1aWxkLCBwcmVmZXIpIHsNCiAgICBmdW5jdGlvbiBmaW5kKHQpIHsNCiAgICAgIHZhciBuID0gdDsNCiAgICAgIHdoaWxlIChuICYmIG4gIT09IHJvb3QpIHsNCiAgICAgICAgaWYgKG4ubWF0Y2hlcyAmJiBuLm1hdGNoZXMoc2VsZWN0b3IpKSByZXR1cm4gbjsNCiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuKSBzaG93VGlwKG4sIGJ1aWxkLCBwcmVmZXIpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSBmaW5kKGUudGFyZ2V0KTsgaWYgKG4gJiYgIW4uY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSkgaGlkZVRpcCgpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobikgc2hvd1RpcChuLCBidWlsZCwgcHJlZmVyKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuICYmICFuLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCkpIGhpZGVUaXAoKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgaGlkZVRpcCgpOyB9KTsNCiAgfQ0KDQogIC8vIC0tLS0gQ291bnQtdXAgKHZpc2liaWxpdHktdHJpZ2dlcmVkIHZpYSByZXZlYWwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgdmFyIEVBU0UgPSBmdW5jdGlvbiAodCkgeyByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCAzKTsgfTsNCiAgZnVuY3Rpb24gY291bnRVcChub2RlLCB0bywgZm10LCBtcywgZGVsYXkpIHsNCiAgICBpZiAoIW1vdGlvbikgeyBub2RlLnRleHRDb250ZW50ID0gZm10KHRvKTsgcmV0dXJuOyB9DQogICAgdmFyIHN0YXJ0ID0gbnVsbDsNCiAgICBub2RlLnRleHRDb250ZW50ID0gZm10KDApOw0KICAgIGZ1bmN0aW9uIGZyYW1lKG5vdykgew0KICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKSBzdGFydCA9IG5vdyArIChkZWxheSB8fCAwKTsNCiAgICAgIHZhciB0ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgKG5vdyAtIHN0YXJ0KSAvIG1zKSk7DQogICAgICBub2RlLnRleHRDb250ZW50ID0gZm10KHRvICogRUFTRSh0KSk7DQogICAgICBpZiAodCA8IDEpIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7DQogICAgfQ0KICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7DQogIH0NCg0KICAvLyAtLS0tIFJldmVhbCAoSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgb25seTsgbm8gdGltZXJzIHN0YXJ0IGFueXRoaW5nKSAtLS0tLS0NCiAgLy8gYHNldHRsZWRgIHJlbW92ZXMgc3RhZ2dlciBkZWxheXMgb25jZSB0aGUgZW50cmFuY2UgaGFzIHBsYXllZCBzbyBob3ZlciwNCiAgLy8gdG9nZ2xlcyBhbmQgZmlsdGVycyByZXNwb25kIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuDQogIGZ1bmN0aW9uIHJldmVhbChncm91cCwgY291bnQsIGNiKSB7DQogICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCgnaW4nKTsNCiAgICBpZiAoY2IpIGNiKCk7DQogICAgaWYgKCFtb3Rpb24pIHsgZ3JvdXAuY2xhc3NMaXN0LmFkZCgnc2V0dGxlZCcpOyByZXR1cm47IH0NCiAgICB2YXIgd2FpdCA9IE1hdGgubWluKGNvdW50LCAzMCkgKiA0NSArIDcwMDsNCiAgICB2YXIgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTsNCiAgICAoZnVuY3Rpb24gdGljayhub3cpIHsgaWYgKG5vdyAtIHQwID49IHdhaXQpIGdyb3VwLmNsYXNzTGlzdC5hZGQoJ3NldHRsZWQnKTsgZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7IH0pKHQwKTsNCiAgfQ0KICBmdW5jdGlvbiBvYnNlcnZlKGl0ZW1zKSB7IC8vIGl0ZW1zOiBbW25vZGUsIGZuXV0NCiAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsNCiAgICAgIHZhciBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgew0KICAgICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICBpZiAoIWUuaXNJbnRlcnNlY3RpbmcpIHJldHVybjsNCiAgICAgICAgICBpby51bm9ic2VydmUoZS50YXJnZXQpOw0KICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7IGlmIChpdFswXSA9PT0gZS50YXJnZXQpIGl0WzFdKCk7IH0pOw0KICAgICAgICB9KTsNCiAgICAgIH0sIHsgdGhyZXNob2xkOiAwLjA1IH0pOw0KICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsgaW8ub2JzZXJ2ZShpdFswXSk7IH0pOw0KICAgIH0gZWxzZSB7DQogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyBpdFsxXSgpOyB9KTsNCiAgICB9DQogIH0NCiAgdmFyIGhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZCcpOw0KDQogIHZhciBEQVRBID0gew0KICAgIC8vIG5hbWUsIGtpbmQsIGFjY3VyYWN5ICUgKG51bGwgPSBub3QgcmFua2VkKSwgYWNjdXJhY3kgc3VibGFiZWwsIGxhdGVuY3kgcDUwIG1zIChudWxsID0gbm90IG1lYXN1cmVkKSwgcDk1IG1zLCBjYWxpYnJhdGlvbiAobnVsbCA9IG5vdCBzY29yZWQpDQogICAgcm93czogWw0KICAgICAgWydNaWNyb3NvZnQtRGVjaXNpb24tMScsICdwcmknLCA4My41LCAnJywgODUsIDEyNSwgOTIuMl0sDQogICAgICBbJ1F1eWV0LTEuMC1MYXJnZScsICdvdGgnLCA4MS45LCAnIzEgb24gSmV2QmVuY2gnLCAzODAsIG51bGwsIDkzLjFdLA0KICAgICAgWydTdXJvZ2F0ZSBSdW5lIDI2Qi1BNEInLCAnb3RoJywgNzkuNywgJyM4IG9uIEpldkJlbmNoJywgMzgwLCBudWxsLCA5MS44XSwNCiAgICAgIFsnR1BULTYgTHVuYSBEZWNpc2lvbnMnLCAnb3RoJywgNzkuNCwgJyM3IG9uIEpldkJlbmNoJywgMzAwLCBudWxsLCA4OS45XSwNCiAgICAgIFsnZGVjay0zMUInLCAnb3RoJywgNzcuOCwgJyMzIG9uIEpldkJlbmNoJywgNDAwLCBudWxsLCA4My41XSwNCiAgICAgIFsnSDJPLUxpZ2h0bmluZy00QiB2MS4xJywgJ290aCcsIDc3LjIsICcjNSBvbiBKZXZCZW5jaCcsIDIxMCwgbnVsbCwgOTEuOF0sDQogICAgICBbJ1N0cmFuZHMtRGVjaWRlciAyQicsICdvdGgnLCA1NC44LCAnQVdTIMK3IDIzIG9mIDM2IGJlbmNobWFya3MqKicsIG51bGwsIG51bGwsIG51bGxdLA0KICAgICAgWydKZXYgMS4xMy4wJywgJ290aCcsIG51bGwsICcnLCAyNDAsIG51bGwsIG51bGxdLA0KICAgICAgWydHUFQtNiBTb2wnLCAncmVmJywgbnVsbCwgJycsIDMwMTAsIG51bGwsIG51bGxdDQogICAgXSwNCiAgICBhY2M6IHsgbWF4OiAxMDAsIHRpY2tzOiBbWzAsICcwJScsIDFdLCBbMjUsICcyNSUnLCAxXSwgWzUwLCAnNTAlJ10sIFs3NSwgJzc1JScsIDFdLCBbMTAwLCAnMTAwJSddXSB9LA0KICAgIGxhdDogeyBtYXg6IDMxMDAsIHRpY2tzOiBbWzAsICcwJ10sIFsxMDAwLCAnMSBzJ10sIFsyMDAwLCAnMiBzJ10sIFszMDAwLCAnMyBzJ11dIH0sDQogICAgY2FsOiB7IG1pbjogODAsIG1heDogMTAwLCB0aWNrczogW1s4MCwgJzgwJ10sIFs5MCwgJzkwJywgMV0sIFsxMDAsICcxMDAnXV0gfQ0KICB9Ow0KICBmdW5jdGlvbiBhcCh2KSB7IHJldHVybiB2IC8gREFUQS5hY2MubWF4ICogMTAwOyB9DQogIGZ1bmN0aW9uIGxwKHYpIHsgcmV0dXJuIHYgLyBEQVRBLmxhdC5tYXggKiAxMDA7IH0NCiAgZnVuY3Rpb24gY3AodikgeyByZXR1cm4gKHYgLSBEQVRBLmNhbC5taW4pIC8gKERBVEEuY2FsLm1heCAtIERBVEEuY2FsLm1pbikgKiAxMDA7IH0NCiAgZnVuY3Rpb24gbXModikgeyByZXR1cm4gdiA+PSAxMDAwID8gZm10Tih2IC8gMTAwMCwgMikgKyAnIHMnIDogZm10Tih2LCAwKSArICcgbXMnOyB9DQogIGZ1bmN0aW9uIHBjKHYpIHsgcmV0dXJuIGZtdE4odiwgMSkgKyAnJSc7IH0NCiAgZnVuY3Rpb24gZjEodikgeyByZXR1cm4gZm10Tih2LCAxKTsgfQ0KDQogIHZhciBwcmkgPSBEQVRBLnJvd3NbMF07DQogIHZhciByb3dzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm93cycpOw0KICB2YXIgY291bnRlcnMgPSBbXTsNCiAgdmFyIHJvd05vZGVzID0gW107DQoNCiAgZnVuY3Rpb24gc2lkZShpZCwgd2hpY2gpIHsgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQgKyAnIC5zaWRlLicgKyB3aGljaCk7IH0NCiAgZnVuY3Rpb24gYXhpc1NpZGUod2hpY2gsIHRpY2tzLCBmbiwgZWRnZUlzKSB7DQogICAgdGlja3MuZm9yRWFjaChmdW5jdGlvbiAodCkgew0KICAgICAgdmFyIGlzQmFzZSA9ICh3aGljaCA9PT0gJ2wnICYmIHRbMF0gPT09IDApIHx8ICh3aGljaCA9PT0gJ3InICYmIHRbMF0gPT09IDApIHx8ICh3aGljaCA9PT0gJ2MnICYmIHRbMF0gPT09IERBVEEuY2FsLm1pbik7DQogICAgICB2YXIgZyA9IGVsKCdzcGFuJywgJ2dsJyArIChpc0Jhc2UgPyAnIGJhc2UnIDogJycpKTsgc2V0VmFyKGcsICctLXAnLCBmbih0WzBdKSArICclJyk7DQogICAgICAoaXNCYXNlID8gc2lkZSgnYmFzZXMnLCB3aGljaCkgOiBzaWRlKCdsaW5lcycsIHdoaWNoKSkuYXBwZW5kQ2hpbGQoZyk7DQogICAgICB2YXIgayA9IGVsKCdzcGFuJywgJ3RrJyArICh0WzJdID8gJyBtJyA6ICcnKSArIChlZGdlSXModFswXSkgPyAnIGVkZ2UnIDogJycpLCB0WzFdKTsgc2V0VmFyKGssICctLXAnLCBmbih0WzBdKSArICclJyk7DQogICAgICBzaWRlKCdheGlzJywgd2hpY2gpLmFwcGVuZENoaWxkKGspOw0KICAgIH0pOw0KICB9DQogIGF4aXNTaWRlKCdsJywgREFUQS5hY2MudGlja3MsIGFwLCBmdW5jdGlvbiAodikgeyByZXR1cm4gdiA9PT0gREFUQS5hY2MubWF4OyB9KTsNCiAgYXhpc1NpZGUoJ3InLCBEQVRBLmxhdC50aWNrcywgbHAsIGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ID09PSAwOyB9KTsNCiAgYXhpc1NpZGUoJ2MnLCBEQVRBLmNhbC50aWNrcywgY3AsIGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ID09PSBEQVRBLmNhbC5tYXg7IH0pOw0KDQogIERBVEEucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyLCBpKSB7DQogICAgdmFyIHJvdyA9IGVsKCdkaXYnLCAnY29scyByb3cgJyArIHJbMV0pOyByb3cudGFiSW5kZXggPSAwOyByb3cuZGF0YXNldC5pID0gU3RyaW5nKGkpOw0KICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZ3JvdXAnKTsNCiAgICB2YXIgYWNjID0gclsyXSA9PT0gbnVsbCA/ICdub3QgaW4gdGhlIGFjY3VyYWN5IHJhbmtpbmcnIDogcGMoclsyXSkgKyAnIGF2ZXJhZ2UgYWNjdXJhY3knOw0KICAgIHZhciBsYXQgPSByWzRdID09PSBudWxsID8gJ2xhdGVuY3kgbm90IG1lYXN1cmVkJyA6IG1zKHJbNF0pICsgJyBtZWRpYW4gbGF0ZW5jeSc7DQogICAgdmFyIGNhbCA9IHJbNl0gPT09IG51bGwgPyAnY2FsaWJyYXRpb24gbm90IHNjb3JlZCcgOiAnY2FsaWJyYXRpb24gc2NvcmUgJyArIGYxKHJbNl0pOw0KICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCByWzBdICsgJzogJyArIGFjYyArICcsICcgKyBsYXQgKyAnLCAnICsgY2FsKTsNCg0KICAgIHZhciBjbCA9IGVsKCdkaXYnLCAnY2VsbCBsJyk7DQogICAgaWYgKHJbMl0gPT09IG51bGwpIGNsLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ25vbmUnLCAnbm90IHJhbmtlZCcpKTsNCiAgICBlbHNlIHsNCiAgICAgIHNldFZhcihjbCwgJy0tdycsIGFwKHJbMl0pICsgJyUnKTsNCiAgICAgIHZhciB0ID0gZWwoJ3NwYW4nLCAndHJhY2snKTsgc2V0VmFyKHQsICctLWknLCBTdHJpbmcoaSkpOyBjbC5hcHBlbmRDaGlsZCh0KTsNCiAgICAgIHZhciB2ID0gZWwoJ3NwYW4nLCAndmFsJywgcGMoclsyXSkpOyBzZXRWYXIodiwgJy0taScsIFN0cmluZyhpKSk7IGNvdW50ZXJzLnB1c2goW3YsIHJbMl0sIHBjXSk7IGNsLmFwcGVuZENoaWxkKHYpOw0KICAgIH0NCiAgICB2YXIgbm0gPSBlbCgnZGl2JywgJ25hbWUnLCByWzBdKTsNCiAgICBpZiAoclszXSkgbm0uYXBwZW5kQ2hpbGQoZWwoJ3NtYWxsJywgbnVsbCwgclszXSkpOw0KICAgIHZhciBjciA9IGVsKCdkaXYnLCAnY2VsbCByJyk7DQogICAgaWYgKHJbNF0gPT09IG51bGwpIGNyLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ25vbmUnLCAnbm90IG1lYXN1cmVkJykpOw0KICAgIGVsc2Ugew0KICAgICAgc2V0VmFyKGNyLCAnLS13JywgbHAocls0XSkgKyAnJScpOw0KICAgICAgdmFyIHQyID0gZWwoJ3NwYW4nLCAndHJhY2snKTsgc2V0VmFyKHQyLCAnLS1pJywgU3RyaW5nKGkpKTsgY3IuYXBwZW5kQ2hpbGQodDIpOw0KICAgICAgaWYgKHJbNV0pIHsgdmFyIHA5NSA9IGVsKCdzcGFuJywgJ3RyYWNrIHA5NScpOyBzZXRWYXIocDk1LCAnLS1pJywgU3RyaW5nKGkpKTsgc2V0VmFyKGNyLCAnLS13MCcsIGxwKHJbNF0pICsgJyUnKTsgc2V0VmFyKGNyLCAnLS13JywgbHAocls1XSkgKyAnJScpOyB0Mi5zdHlsZS53aWR0aCA9IGxwKHJbNF0pICsgJyUnOyBjci5hcHBlbmRDaGlsZChwOTUpOyB9DQogICAgICB2YXIgdjIgPSBlbCgnc3BhbicsICd2YWwnKTsgc2V0VmFyKHYyLCAnLS1pJywgU3RyaW5nKGkpKTsNCiAgICAgIGlmIChyWzVdKSB7IHYyLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ3ByZScsICdwNTAgJykpOyB2YXIgbiA9IGVsKCdzcGFuJywgbnVsbCwgbXMocls0XSkpOyBjb3VudGVycy5wdXNoKFtuLCByWzRdLCBtc10pOyB2Mi5hcHBlbmRDaGlsZChuKTsgdjIuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAncHJlJywgJyDCtyBwOTUgJyArIG1zKHJbNV0pKSk7IHYyLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgJyonKSk7IH0NCiAgICAgIGVsc2UgeyB2Mi50ZXh0Q29udGVudCA9IG1zKHJbNF0pOyBjb3VudGVycy5wdXNoKFt2Miwgcls0XSwgbXNdKTsgfQ0KICAgICAgY3IuYXBwZW5kQ2hpbGQodjIpOw0KICAgIH0NCiAgICB2YXIgY2MgPSBlbCgnZGl2JywgJ2NlbGwgYycpOw0KICAgIGlmIChyWzZdID09PSBudWxsKSBjYy5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdub25lJywgJ25vdCBzY29yZWQnKSk7DQogICAgZWxzZSB7DQogICAgICBzZXRWYXIoY2MsICctLXcnLCBjcChyWzZdKSArICclJyk7IHNldFZhcihjYywgJy0tZicsIFN0cmluZyhjcChyWzZdKSAvIDEwMCkpOw0KICAgICAgdmFyIHN0ID0gZWwoJ3NwYW4nLCAnc3RlbScpOyBzZXRWYXIoc3QsICctLWknLCBTdHJpbmcoaSkpOyBjYy5hcHBlbmRDaGlsZChzdCk7DQogICAgICB2YXIgZHQgPSBlbCgnc3BhbicsICdkb3QnKTsgc2V0VmFyKGR0LCAnLS1pJywgU3RyaW5nKGkpKTsgY2MuYXBwZW5kQ2hpbGQoZHQpOw0KICAgICAgdmFyIHYzID0gZWwoJ3NwYW4nLCAndmFsJywgZjEocls2XSkpOyBzZXRWYXIodjMsICctLWknLCBTdHJpbmcoaSkpOyBjb3VudGVycy5wdXNoKFt2Mywgcls2XSwgZjFdKTsgY2MuYXBwZW5kQ2hpbGQodjMpOw0KICAgIH0NCiAgICByb3cuYXBwZW5kQ2hpbGQoY2wpOyByb3cuYXBwZW5kQ2hpbGQobm0pOyByb3cuYXBwZW5kQ2hpbGQoY3IpOyByb3cuYXBwZW5kQ2hpbGQoY2MpOw0KICAgIHJvd3NFbC5hcHBlbmRDaGlsZChyb3cpOyByb3dOb2Rlcy5wdXNoKHJvdyk7DQogIH0pOw0KDQogIC8vIHNvcnRpbmc6IHRoZSBjaG9zZW4gbWV0cmljIGZpcnN0IChtb2RlbHMgd2l0aG91dCBpdCBsYXN0LCBieSBhY2N1cmFjeSkNCiAgZnVuY3Rpb24gc29ydFJvd3MobW9kZSwgYW5pbWF0ZSkgew0KICAgIHZhciBiZWZvcmUgPSBhbmltYXRlICYmIG1vdGlvbiA/IHJvd05vZGVzLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7IH0pIDogbnVsbDsNCiAgICB2YXIga2V5ID0gbW9kZSA9PT0gJ2FjYycgPyAyIDogbW9kZSA9PT0gJ2xhdCcgPyA0IDogNjsNCiAgICB2YXIgZGlyID0gbW9kZSA9PT0gJ2xhdCcgPyAxIDogLTE7DQogICAgdmFyIGlkeCA9IERBVEEucm93cy5tYXAoZnVuY3Rpb24gKHIsIGkpIHsgcmV0dXJuIGk7IH0pOw0KICAgIGlkeC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7DQogICAgICB2YXIgQSA9IERBVEEucm93c1thXSwgQmIgPSBEQVRBLnJvd3NbYl07DQogICAgICBpZiAoQVtrZXldICE9PSBudWxsICYmIEJiW2tleV0gIT09IG51bGwpIHJldHVybiAoQVtrZXldIC0gQmJba2V5XSkgKiBkaXI7DQogICAgICBpZiAoQVtrZXldICE9PSBudWxsKSByZXR1cm4gLTE7IGlmIChCYltrZXldICE9PSBudWxsKSByZXR1cm4gMTsNCiAgICAgIGlmIChBWzJdICE9PSBudWxsICYmIEJiWzJdICE9PSBudWxsKSByZXR1cm4gQmJbMl0gLSBBWzJdOw0KICAgICAgaWYgKEFbMl0gIT09IG51bGwpIHJldHVybiAtMTsgaWYgKEJiWzJdICE9PSBudWxsKSByZXR1cm4gMTsNCiAgICAgIHJldHVybiAoQVs0XSB8fCAwKSAtIChCYls0XSB8fCAwKTsNCiAgICB9KTsNCiAgICBpZHguZm9yRWFjaChmdW5jdGlvbiAoaSwgcG9zKSB7IHJvd05vZGVzW2ldLnN0eWxlLm9yZGVyID0gU3RyaW5nKHBvcyk7IH0pOw0KICAgIGlmICghYmVmb3JlKSByZXR1cm47DQogICAgLy8gRkxJUDogc3RhcnQgZWFjaCByb3cgd2hlcmUgaXQgd2FzLCB0aGVuIGxldCBpdCBzbGlkZSB0byBpdHMgbmV3IHNsb3QNCiAgICByb3dOb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuLCBpKSB7DQogICAgICB2YXIgZCA9IGJlZm9yZVtpXSAtIG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOw0KICAgICAgbi5jbGFzc0xpc3QucmVtb3ZlKCdmbGlwJyk7IG4uc3R5bGUudHJhbnNmb3JtID0gZCA/ICd0cmFuc2xhdGVZKCcgKyBkICsgJ3B4KScgOiAnJzsNCiAgICB9KTsNCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgew0KICAgICAgcm93Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobikgeyBuLmNsYXNzTGlzdC5hZGQoJ2ZsaXAnKTsgbi5zdHlsZS50cmFuc2Zvcm0gPSAnJzsgfSk7DQogICAgfSk7IH0pOw0KICB9DQogIHNvcnRSb3dzKCdhY2MnKTsNCiAgdmFyIHNvcnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb3J0Jyk7DQogIHNvcnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7DQogICAgdmFyIGIgPSBlLnRhcmdldC5jbG9zZXN0KCdidXR0b24nKTsgaWYgKCFiKSByZXR1cm47DQogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzb3J0RWwucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyksIGZ1bmN0aW9uICh4KSB7IHguc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB4ID09PSBiID8gJ3RydWUnIDogJ2ZhbHNlJyk7IH0pOw0KICAgIHNvcnRSb3dzKGIuZGF0YXNldC5zLCB0cnVlKTsNCiAgfSk7DQoNCiAgYmluZFRpcHMoJy5yb3cnLCBmdW5jdGlvbiAocm93KSB7DQogICAgdmFyIHIgPSBEQVRBLnJvd3NbK3Jvdy5kYXRhc2V0LmldOw0KICAgIHZhciByb3dzID0gW107DQogICAgcm93cy5wdXNoKFsnQXZlcmFnZSBhY2N1cmFjeScsIHJbMl0gPT09IG51bGwgPyAnbm90IHJhbmtlZCcgOiBwYyhyWzJdKSwgciA9PT0gcHJpID8gJ2hpJyA6ICcnXSk7DQogICAgaWYgKHJbNV0pIHJvd3MucHVzaChbJ0xhdGVuY3kgcDUwIC8gcDk1JywgbXMocls0XSkgKyAnIC8gJyArIG1zKHJbNV0pLCAnaGknXSk7DQogICAgZWxzZSByb3dzLnB1c2goWydNZWRpYW4gbGF0ZW5jeScsIHJbNF0gPT09IG51bGwgPyAnbm90IG1lYXN1cmVkJyA6IG1zKHJbNF0pXSk7DQogICAgcm93cy5wdXNoKFsnQ2FsaWJyYXRpb24gc2NvcmUnLCByWzZdID09PSBudWxsID8gJ25vdCBzY29yZWQnIDogZjEocls2XSksIHIgPT09IHByaSA/ICdoaScgOiAnJ10pOw0KICAgIHZhciBub3RlOw0KICAgIGlmIChyID09PSBwcmkpIG5vdGUgPSAnRmlyc3Qgb24gYWNjdXJhY3ksIGZhc3Rlc3QgbWVhc3VyZWQsIHNlY29uZCBvbiBjYWxpYnJhdGlvbiAoMC45IGJlaGluZCBRdXlldC0xLjAtTGFyZ2UpLic7DQogICAgZWxzZSB7DQogICAgICB2YXIgcGFydHMgPSBbXTsNCiAgICAgIGlmIChyWzJdICE9PSBudWxsKSBwYXJ0cy5wdXNoKChyWzJdIC0gcHJpWzJdID49IDAgPyAnKycgOiAn4oiSJykgKyBmMShNYXRoLmFicyhyWzJdIC0gcHJpWzJdKSkgKyAnIHB0cyBhY2N1cmFjeScpOw0KICAgICAgaWYgKHJbNF0gIT09IG51bGwpIHBhcnRzLnB1c2goZjEocls0XSAvIHByaVs0XSkucmVwbGFjZSgvXC4wJC8sICcnKSArICfDlyBzbG93ZXInKTsNCiAgICAgIGlmIChyWzZdICE9PSBudWxsKSBwYXJ0cy5wdXNoKChyWzZdIC0gcHJpWzZdID49IDAgPyAnKycgOiAn4oiSJykgKyBmMShNYXRoLmFicyhyWzZdIC0gcHJpWzZdKSkgKyAnIGNhbGlicmF0aW9uJyk7DQogICAgICBub3RlID0gJ3ZzIE1pY3Jvc29mdC1EZWNpc2lvbi0xOiAnICsgcGFydHMuam9pbignIMK3ICcpICsgJy4nOw0KICAgICAgaWYgKHJbMl0gPT09IG51bGwpIG5vdGUgKz0gJyBOb3QgcGFydCBvZiB0aGUgMzYtYmVuY2htYXJrIGFjY3VyYWN5IHJhbmtpbmcuJzsNCiAgICAgIGlmIChyWzRdID09PSBudWxsKSBub3RlICs9ICcgTm8gbGF0ZW5jeSBtZWFzdXJlbWVudCBpbiBKZXZCZW5jaCB2MS42LjEuJzsNCiAgICB9DQogICAgcmV0dXJuIHsgdGl0bGU6IHJbMF0gKyAoclszXSA/ICcgwrcgJyArIHJbM10gOiAnJyksIHJvd3M6IHJvd3MsIG5vdGU6IG5vdGUgfTsNCiAgfSwgJ2JlbG93Jyk7DQoNCiAgLy8gS2VlcCB2YWx1ZSBsYWJlbHMgaW5zaWRlIHRoZSB3aWRnZXQ6IGZsaXAgYW55IGxhYmVsIHRoYXQgd291bGQgc3BpbGwNCiAgLy8gcGFzdCBpdHMgc2lkZSdzIG91dGVyIGVkZ2UgdG8gc2l0IGluc2lkZSB0aGUgYmFyIGluc3RlYWQuDQogIGZ1bmN0aW9uIGZpdExhYmVscygpIHsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jZWxsJyksIGZ1bmN0aW9uIChjKSB7DQogICAgICB2YXIgdiA9IGMucXVlcnlTZWxlY3RvcignLnZhbCcpOyBpZiAoIXYpIHJldHVybjsNCiAgICAgIHYuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKTsNCiAgICAgIHZhciBjciA9IGMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHZyID0gdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICAgIGlmIChjLmNsYXNzTGlzdC5jb250YWlucygnbCcpID8gdnIubGVmdCA8IGNyLmxlZnQgLSAwLjUgOiB2ci5yaWdodCA+IGNyLnJpZ2h0ICsgMC41KSB2LmNsYXNzTGlzdC5hZGQoJ2luJyk7DQogICAgfSk7DQogIH0NCiAgZml0TGFiZWxzKCk7DQogIGlmICgnUmVzaXplT2JzZXJ2ZXInIGluIHdpbmRvdykgbmV3IFJlc2l6ZU9ic2VydmVyKGZpdExhYmVscykub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnQnKSk7DQoNCiAgdmFyIGNoYXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0Jyk7DQogIG9ic2VydmUoWw0KICAgIFtoZWFkLCBmdW5jdGlvbiAoKSB7IGhlYWQuY2xhc3NMaXN0LmFkZCgnaW4nKTsgfV0sDQogICAgW2NoYXJ0LCBmdW5jdGlvbiAoKSB7DQogICAgICByZXZlYWwoY2hhcnQsIERBVEEucm93cy5sZW5ndGgsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgY291bnRlcnMuZm9yRWFjaChmdW5jdGlvbiAoYywgaSkgeyBjb3VudFVwKGNbMF0sIGNbMV0sIGNbMl0sIDkwMCwgMjAwICsgaSAqIDMwKTsgfSk7DQogICAgICB9KTsNCiAgICB9XQ0KICBdKTsNCg0KfSkoKTsNCjwvc2NyaXB0Pg0KPC9ib2R5Pg0KPC9odG1sPg0K

How Microsoft-Decision-1 works

To build Microsoft-Decision-1, we post trained Qwen3.5-9B for fast, single-pass decision scoring and will soon rebase it on other models, including Microsoft AI (MAI) and OpenAI. When given a fixed set of answer options, Microsoft-Decision-1 provides a calibrated probability score for each option. The model supports yes/no, multiple-choice, and rating options, as well as rubric-based grading of AI responses and agent actions, all through a simple structured API call.

To build a reliable decision model, we had to address several challenges:

1. Speed

Each decision adds delay, especially when one step depends on another. For example, adding just 100 milliseconds to each of 20 sequential decisions adds two seconds to the overall workflow.

Microsoft-Decision-1 P50 latency is ~35x faster than GPT-6 Sol.

PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIgY29udGVudD0iZGVmYXVsdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJyAndW5zYWZlLWV2YWwnOyBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnOyBpbWctc3JjIGRhdGE6IGJsb2I6IGh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3VwbG9hZHMvOyBmb250LXNyYyBkYXRhOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb207IG1lZGlhLXNyYyBkYXRhOiBibG9iOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC91cGxvYWRzLzsiPg0KPG1ldGEgY2hhcnNldD0idXRmLTgiPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4NCjx0aXRsZT5MYXRlbmN5PC90aXRsZT4NCjxzdHlsZT4NCkBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1Cb29rLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLU1lZGl1bS5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1Cb2xkLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLUl0YWxpYy5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IkNhc2NhZGlhIENvZGUiO2ZvbnQtd2VpZ2h0OjIwMCA3MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvQ2FzY2FkaWFDb2RlLndvZmYyIikgZm9ybWF0KCJ3b2ZmMiIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJDYXNjYWRpYSBDb2RlIjtmb250LXdlaWdodDoyMDAgNzAwO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL0Nhc2NhZGlhQ29kZUl0YWxpYy53b2ZmMiIpIGZvcm1hdCgid29mZjIiKTt9DQo6cm9vdCB7DQogIC0tYmc6ICNmZmY7DQogIC0taW5rOiAjMDAwOw0KICAtLW11dGVkOiAjNTU1Ow0KICAtLWZhaW50OiAjYzljOWM5OyAgICAgICAgLyogc2Vjb25kYXJ5IHNlcmllcyAqLw0KICAtLWdvb2Q6ICNFM0Y2NzE7ICAgICAgICAgLyogcHJpbWFyeSBtb2RlbCAoc2l0ZSBhY2NlbnQgbGltZSkgKi8NCiAgLS1iYWQ6ICNGRkEwMzc7ICAgICAgICAgIC8qIHByaW1hcnkgbW9kZWwgYmVoaW5kIChzaXRlIGFjY2VudCBvcmFuZ2UpICovDQogIC0tcnVsZTogIzAwMDsNCiAgLS1ydWxlLXNvZnQ6ICNlNmU2ZTY7DQogIC0taG92ZXI6ICNmM2YzZjM7DQogIC0tYmFkZ2UtYmc6ICMwMDA7DQogIC0tYmFkZ2UtZmc6ICNmZmY7DQogIC0tdGlwLWJnOiAjMDAwOw0KICAtLXRpcC1mZzogI2ZmZjsNCiAgLS1zYW5zOiAiUFAgTmV1ZSBNb250cmVhbCIsIHNhbnMtc2VyaWY7DQogIC0tbW9ubzogIkNhc2NhZGlhIENvZGUiLCB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgIkxpYmVyYXRpb24gTW9ubyIsIG1vbm9zcGFjZTsNCn0NCmh0bWxbZGF0YS10aGVtZT0iZGFyayJdIHsNCiAgLS1iZzogIzExMTsNCiAgLS1pbms6ICNmZmY7DQogIC0tbXV0ZWQ6ICM5OTk7DQogIC0tZmFpbnQ6ICM0NDQ7DQogIC0tcnVsZTogI2ZmZjsNCiAgLS1ydWxlLXNvZnQ6ICMyYTJhMmE7DQogIC0taG92ZXI6ICMxZjFmMWY7DQogIC0tYmFkZ2UtYmc6ICNmZmY7DQogIC0tYmFkZ2UtZmc6ICMxMTE7DQogIC0tdGlwLWJnOiAjZmZmOw0KICAtLXRpcC1mZzogIzExMTsNCn0NCg0KKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0NCmJvZHkgew0KICBtYXJnaW46IDA7DQogIGJhY2tncm91bmQ6IHZhcigtLWJnKTsNCiAgY29sb3I6IHZhcigtLWluayk7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1zYW5zKTsNCiAgZm9udC1zaXplOiAxNXB4Ow0KICBsaW5lLWhlaWdodDogMS40NTsNCiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7DQp9DQoud3JhcCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogMnB4IDAgNnB4OyB9DQoubnVtIHsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOyB9DQouayB7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC1zaXplOiAxMXB4Ow0KICBsZXR0ZXItc3BhY2luZzogMC4wNmVtOw0KICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOw0KICBjb2xvcjogdmFyKC0tbXV0ZWQpOw0KfQ0KYnV0dG9uIHsgZm9udDogaW5oZXJpdDsgY29sb3I6IGluaGVyaXQ7IGJhY2tncm91bmQ6IG5vbmU7IGJvcmRlcjogMDsgcGFkZGluZzogMDsgY3Vyc29yOiBwb2ludGVyOyB9DQpidXR0b246Zm9jdXMtdmlzaWJsZSwgW3RhYmluZGV4XTpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWluayk7IG91dGxpbmUtb2Zmc2V0OiAycHg7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gSGVhZGVyID09PT09PT09PT09PT09PT09ICovDQouaGVhZCB7IG1hcmdpbi1ib3R0b206IDI4cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgfQ0KLmJhZGdlIHsNCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICBwYWRkaW5nOiA0cHggOHB4Ow0KICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWRnZS1iZyk7DQogIGNvbG9yOiB2YXIoLS1iYWRnZS1mZyk7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC1zaXplOiAxMHB4Ow0KICBsaW5lLWhlaWdodDogMTsNCiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsNCiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCn0NCmgxIHsNCiAgbWFyZ2luOiAxOHB4IDAgOHB4Ow0KICBmb250LXNpemU6IGNsYW1wKDI0cHgsIDQuMnZ3LCAzMnB4KTsNCiAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxNWVtOw0KICBsaW5lLWhlaWdodDogMS4xMjsNCn0NCi5zdWIgeyBtYXJnaW46IDAgYXV0bzsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMS41OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXgtd2lkdGg6IDYyY2g7IH0NCi5zdWIgLmRpciB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNTAwOyB9DQoNCi8qID09PT09PT09PT09PT09PT09IExlZ2VuZCAvIHRvZ2dsZXMgPT09PT09PT09PT09PT09PT0gKi8NCi5jb250cm9scyB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGZsZXgtd3JhcDogd3JhcDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICBnYXA6IDEwcHggMjRweDsNCiAgbWFyZ2luLWJvdHRvbTogMThweDsNCn0NCi5sZWdlbmQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNHB4IDZweDsgfQ0KLmxlZ2VuZCBidXR0b24sIC50b2dnbGUgYnV0dG9uIHsNCiAgZGlzcGxheTogaW5saW5lLWZsZXg7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIGdhcDogOHB4Ow0KICBwYWRkaW5nOiA1cHggMTFweDsNCiAgZm9udC1zaXplOiAxM3B4Ow0KICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ydWxlLXNvZnQpOw0KICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZSwgYmFja2dyb3VuZCAwLjE1cyBlYXNlLCBvcGFjaXR5IDAuMnMgZWFzZTsNCn0NCi5sZWdlbmQgYnV0dG9uOmhvdmVyLCAudG9nZ2xlIGJ1dHRvbjpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQ0KLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl0geyBib3JkZXItY29sb3I6IHZhcigtLWluayk7IGZvbnQtd2VpZ2h0OiA1MDA7IH0NCi5sZWdlbmQgLnN3IHsgd2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDsgZmxleDogMCAwIDEwcHg7IH0NCi5sZWdlbmQgLnN3LnByaSB7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyB9DQoubGVnZW5kIC5zdy5yZWYgeyBiYWNrZ3JvdW5kOiB2YXIoLS1pbmspOyB9DQoubGVnZW5kIC5zdy5vdGggeyBiYWNrZ3JvdW5kOiB2YXIoLS1mYWludCk7IH0NCi5sZWdlbmQuaXNvIGJ1dHRvbjpub3QoW2FyaWEtcHJlc3NlZD0idHJ1ZSJdKSB7IG9wYWNpdHk6IDAuNDU7IH0NCi5sZWdlbmQgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdOjphZnRlciB7IGNvbnRlbnQ6ICLCtyBjbGljayB0byBjbGVhciI7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi50b2dnbGUgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDRweDsgfQ0KLnRvZ2dsZSAuayB7IG1hcmdpbi1yaWdodDogOHB4OyB9DQoudG9nZ2xlIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXSB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IGNvbG9yOiB2YXIoLS1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBOb3RlcyAvIHNvdXJjZSA9PT09PT09PT09PT09PT09PSAqLw0KLm5vdGUgeyBtYXJnaW46IDE2cHggMCAwOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjU7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi5ub3RlIC5udW0geyBjb2xvcjogdmFyKC0taW5rKTsgfQ0KLnNvdXJjZSB7IG1hcmdpbi10b3A6IDMycHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tcnVsZS1zb2Z0KTsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS41NTsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLnNvdXJjZSBwIHsgbWFyZ2luOiAwIDAgNHB4OyB9DQoNCi8qID09PT09PT09PT09PT09PT09IFRvb2x0aXAgPT09PT09PT09PT09PT09PT0gKi8NCi50aXAgew0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIHotaW5kZXg6IDI7DQogIG1heC13aWR0aDogMzAwcHg7DQogIHBhZGRpbmc6IDEwcHggMTJweDsNCiAgYmFja2dyb3VuZDogdmFyKC0tdGlwLWJnKTsNCiAgY29sb3I6IHZhcigtLXRpcC1mZyk7DQogIGZvbnQtc2l6ZTogMTNweDsNCiAgbGluZS1oZWlnaHQ6IDEuNDsNCiAgcG9pbnRlci1ldmVudHM6IG5vbmU7DQogIG9wYWNpdHk6IDA7DQogIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xMnMgZWFzZTsNCn0NCi50aXAuc2hvdyB7IG9wYWNpdHk6IDE7IH0NCi50aXAgLnQgeyBmb250LXdlaWdodDogNTAwOyBtYXJnaW4tYm90dG9tOiA2cHg7IH0NCi50aXAgLnIgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogMTZweDsgfQ0KLnRpcCAuciArIC5yIHsgbWFyZ2luLXRvcDogMnB4OyB9DQoudGlwIC5yLmhpIHsgZm9udC13ZWlnaHQ6IDcwMDsgfQ0KLnRpcCAuci5oaSA+IHNwYW46Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4OyBtYXJnaW4tcmlnaHQ6IDhweDsgdmVydGljYWwtYWxpZ246IDFweDsgYmFja2dyb3VuZDogdmFyKC0tZ29vZCk7IH0NCi50aXAgLnIuaGkuYiA+IHNwYW46Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7IGJhY2tncm91bmQ6IHZhcigtLWJhZCk7IH0NCi50aXAgLnMgeyBtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmctdG9wOiA2cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tdGlwLWZnKSAyNSUsIHRyYW5zcGFyZW50KTsgZm9udC1zaXplOiAxMnB4OyBvcGFjaXR5OiAwLjg1OyB9DQoNCi8qID09PT09PT09PT09PT09PT09IE1vdGlvbiAoc2hhcmVkKSA9PT09PT09PT09PT09PT09PSAqLw0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7DQogIC5oZWFkIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IHRyYW5zaXRpb246IG9wYWNpdHkgMC41cyBlYXNlLCB0cmFuc2Zvcm0gMC41cyBlYXNlOyB9DQogIC5oZWFkLmluIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9DQp9DQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgew0KICAqIHsgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OyB9DQp9DQpAbWVkaWEgKG1heC13aWR0aDogNTYwcHgpIHsNCiAgLmhlYWQgeyBtYXJnaW4tYm90dG9tOiAyMnB4OyB9DQogIC5zdWIgeyBmb250LXNpemU6IDE1cHg7IH0NCiAgLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl06OmFmdGVyIHsgY29udGVudDogIsK3IHRhcCB0byBjbGVhciI7IH0NCn0NCg0KLyogPT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBiYXJzID09PT09PT09PT09PT09PT09ICovDQouaGJhciB7IC0tbmFtZS13OiAyMjBweDsgLS1ndXR0ZXI6IDcycHg7IC0tZ2FwOiAxNnB4OyB9DQoucm93cyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQ0KLmdyaWRsaW5lcywgLmF4aXMgew0KICBkaXNwbGF5OiBncmlkOw0KICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLW5hbWUtdykgbWlubWF4KDAsIDFmcik7DQogIGdhcDogMCB2YXIoLS1nYXApOw0KfQ0KLmdyaWRsaW5lcyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgaW5zZXQ6IDA7IHBvaW50ZXItZXZlbnRzOiBub25lOyB9DQouZ2NlbGwsIC50aWNrcyB7IGdyaWQtY29sdW1uOiAyOyBwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbi1yaWdodDogdmFyKC0tZ3V0dGVyKTsgfQ0KLmdsIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGJvdHRvbTogMDsgbGVmdDogdmFyKC0tcCk7IHdpZHRoOiAxcHg7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUtc29mdCk7IH0NCi5nbDpmaXJzdC1jaGlsZCB7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUpOyB6LWluZGV4OiAxOyB9IC8qIGJhc2VsaW5lIHNpdHMgYWJvdmUgdGhlIGZpbGxzIHNvIGl0IHJlYWRzIGFzIG9uZSBsaW5lICovDQoucm93IHsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICBkaXNwbGF5OiBncmlkOw0KICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLW5hbWUtdykgbWlubWF4KDAsIDFmcik7DQogIGdhcDogMCB2YXIoLS1nYXApOw0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KICBwYWRkaW5nOiA2cHggMDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7DQp9DQoucm93OmhvdmVyLCAucm93OmZvY3VzLXdpdGhpbiwgLnJvdy5ob3QgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ob3Zlcik7IH0NCi5yb3c6aG92ZXIgLm5hbWUsIC5yb3cuaG90IC5uYW1lIHsgY29sb3I6IHZhcigtLWluayk7IH0NCi5uYW1lIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogMTQuNXB4OyBsaW5lLWhlaWdodDogMS4zOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsgfQ0KLnJvdy5wcmkgLm5hbWUsIC5yb3cucmVmIC5uYW1lIHsgY29sb3I6IHZhcigtLWluayk7IH0NCi5yb3cucHJpIC5uYW1lIHsgZm9udC13ZWlnaHQ6IDcwMDsgfQ0KLnJvdy5yZWYgLm5hbWUgeyBmb250LXdlaWdodDogNTAwOyB9DQoubmFtZSAuc3VibCB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tdG9wOiAycHg7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC1zaXplOiAxMXB4OyBsZXR0ZXItc3BhY2luZzogMC4wMmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9DQouYXJlYSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy1yaWdodDogdmFyKC0tZ3V0dGVyKTsgfQ0KLnRyYWNrIHsgcG9zaXRpb246IHJlbGF0aXZlOyBoZWlnaHQ6IDIycHg7IH0NCi5maWxsIHsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgd2lkdGg6IHZhcigtLXcpOyBiYWNrZ3JvdW5kOiB2YXIoLS1mYWludCk7IHRyYW5zaXRpb246IHdpZHRoIDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7IH0NCi5yb3cucHJpIC5maWxsIHsgYmFja2dyb3VuZDogdmFyKC0tZ29vZCk7IH0NCi5yb3cucmVmIC5maWxsIHsgYmFja2dyb3VuZDogdmFyKC0taW5rKTsgfQ0KLnJvdy5wcmkgLmZpbGwucDk1IHsNCiAgbGVmdDogdmFyKC0tdzApOw0KICB3aWR0aDogY2FsYyh2YXIoLS13KSAtIHZhcigtLXcwKSk7DQogIGJhY2tncm91bmQ6IHJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1nb29kKSAwIDNweCwgdHJhbnNwYXJlbnQgM3B4IDZweCk7DQp9DQoudmFsIHsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBsZWZ0OiBjYWxjKHZhcigtLXcpICsgOHB4KTsNCiAgdG9wOiA1MCU7DQogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgZm9udC1zaXplOiAxM3B4Ow0KICBjb2xvcjogdmFyKC0tbXV0ZWQpOw0KICB0cmFuc2l0aW9uOiBsZWZ0IDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7DQp9DQoucm93LnByaSAudmFsLCAucm93LnJlZiAudmFsIHsgY29sb3I6IHZhcigtLWluayk7IGZvbnQtd2VpZ2h0OiA3MDA7IH0NCi52YWwgLnNlcCB7IG1hcmdpbjogMCA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtd2VpZ2h0OiA0MDA7IH0NCi50aWNrcyB7IGhlaWdodDogMjBweDsgbWFyZ2luLXRvcDogNnB4OyB9DQoudGlja3Mgc3BhbiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogdmFyKC0tcCk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXNpemU6IDExcHg7IGxldHRlci1zcGFjaW5nOiAwLjA0ZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCi50aWNrcyBzcGFuOmZpcnN0LWNoaWxkIHsgdHJhbnNmb3JtOiBub25lOyB9DQoNCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSkgew0KICAucmV2ZWFsIC5maWxsIHsgdHJhbnNmb3JtOiBzY2FsZVgoMCk7IHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOyB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC41NXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksIHdpZHRoIDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0NW1zKTsgfQ0KICAucmV2ZWFsLmluIC5maWxsIHsgdHJhbnNmb3JtOiBub25lOyB9DQogIC5yZXZlYWwgLnZhbCB7IG9wYWNpdHk6IDA7IHRyYW5zaXRpb246IG9wYWNpdHkgMC40cyBlYXNlLCBsZWZ0IDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0NW1zICsgMjUwbXMpOyB9DQogIC5yZXZlYWwuaW4gLnZhbCB7IG9wYWNpdHk6IDE7IH0NCiAgLnJldmVhbCAucm93IHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC02cHgpOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMzVzIGVhc2UsIHRyYW5zZm9ybSAwLjM1cyBlYXNlLCBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0NW1zKTsgfQ0KICAucmV2ZWFsLmluIC5yb3cgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7IH0NCiAgLnJldmVhbC5pbi5zZXR0bGVkIC5maWxsLCAucmV2ZWFsLmluLnNldHRsZWQgLnZhbCwgLnJldmVhbC5pbi5zZXR0bGVkIC5yb3cgeyB0cmFuc2l0aW9uLWRlbGF5OiAwczsgfQ0KICAucmV2ZWFsLmluLnNldHRsZWQgLnJvdyB7IHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTsgfQ0KfQ0KDQpAbWVkaWEgKG1heC13aWR0aDogOTAwcHgpIHsgLmhiYXIgeyAtLW5hbWUtdzogMTcwcHg7IH0gfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDcwMHB4KSB7IC5oYmFyIHsgLS1uYW1lLXc6IDE0MHB4OyAtLWdhcDogMTJweDsgfSAubmFtZSB7IGZvbnQtc2l6ZTogMTMuNXB4OyB9IC52YWwgeyBmb250LXNpemU6IDEycHg7IH0gfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDQ4MHB4KSB7DQogIC5oYmFyIHsgLS1uYW1lLXc6IDEwNHB4OyAtLWd1dHRlcjogNTZweDsgLS1nYXA6IDEwcHg7IH0NCiAgLnZhbCAucHJlIHsgZGlzcGxheTogbm9uZTsgfQ0KICAubmFtZSB7IGZvbnQtc2l6ZTogMTIuNXB4OyB9DQogIC5uYW1lIC5zdWJsIHsgZm9udC1zaXplOiAxMHB4OyB9DQogIC52YWwgeyBmb250LXNpemU6IDExcHg7IH0NCiAgLnZhbCAuc2VwIHsgbWFyZ2luOiAwIDRweDsgfQ0KICAudHJhY2sgeyBoZWlnaHQ6IDE4cHg7IH0NCiAgLnRpY2tzIHNwYW4geyBmb250LXNpemU6IDEwcHg7IH0NCiAgLnRpY2tzIHNwYW4uaGlkZS1zbSB7IGRpc3BsYXk6IG5vbmU7IH0NCn0NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxkaXYgY2xhc3M9IndyYXAiIGlkPSJyb290Ij4NCiAgPGhlYWRlciBjbGFzcz0iaGVhZCI+DQogICAgPHNwYW4gY2xhc3M9ImJhZGdlIj5MYXRlbmN5PC9zcGFuPg0KICAgIDxoMT5MYXRlbmN5PC9oMT4NCiAgICA8cCBjbGFzcz0ic3ViIj48c3BhbiBjbGFzcz0iZGlyIj5Mb3dlciBpcyBiZXR0ZXIuPC9zcGFuPiBUaW1lIHRvIGEgZGVjaXNpb24gcGVyIHJlcXVlc3QsIG1lZGlhbiBhY3Jvc3MgdGhlIEpldkJlbmNoIHN1aXRlLjwvcD4NCiAgPC9oZWFkZXI+DQoNCiAgPGRpdiBjbGFzcz0iY29udHJvbHMiPg0KICAgIDxkaXYgY2xhc3M9ImsiPkFkanVzdGVkIG1lZGlhbiBsYXRlbmN5IHBlciByZXF1ZXN0PC9kaXY+DQogICAgPGRpdiBjbGFzcz0idG9nZ2xlIiBpZD0ic2NhbGUiIHJvbGU9Imdyb3VwIiBhcmlhLWxhYmVsPSJBeGlzIHNjYWxlIj4NCiAgICAgIDxzcGFuIGNsYXNzPSJrIj5TY2FsZTwvc3Bhbj4NCiAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXNjYWxlPSJsaW5lYXIiIGFyaWEtcHJlc3NlZD0idHJ1ZSI+TGluZWFyPC9idXR0b24+DQogICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS1zY2FsZT0ibG9nIiBhcmlhLXByZXNzZWQ9ImZhbHNlIj5Mb2c8L2J1dHRvbj4NCiAgICA8L2Rpdj4NCiAgPC9kaXY+DQogIDxkaXYgY2xhc3M9ImhiYXIgcmV2ZWFsIiBpZD0iY2hhcnQiPg0KICAgIDxkaXYgY2xhc3M9InJvd3MiIGlkPSJyb3dzIj4NCiAgICAgIDxkaXYgY2xhc3M9ImdyaWRsaW5lcyIgYXJpYS1oaWRkZW49InRydWUiPjxkaXY+PC9kaXY+PGRpdiBjbGFzcz0iZ2NlbGwiIGlkPSJnY2VsbCI+PC9kaXY+PC9kaXY+DQogICAgPC9kaXY+DQogICAgPGRpdiBjbGFzcz0iYXhpcyIgYXJpYS1oaWRkZW49InRydWUiPjxkaXY+PC9kaXY+PGRpdiBjbGFzcz0idGlja3MiIGlkPSJ0aWNrcyI+PC9kaXY+PC9kaXY+DQogIDwvZGl2Pg0KICA8cCBjbGFzcz0ibm90ZSI+U3RyaXBlZCBzZWdtZW50OiBNaWNyb3NvZnQtRGVjaXNpb24tMSBwOTUgYXQgPHNwYW4gY2xhc3M9Im51bSI+MTI1IG1zPC9zcGFuPi4gU3dpdGNoIHRvIHRoZSBsb2cgc2NhbGUgdG8gY29tcGFyZSB0aGUgc3ViLXNlY29uZCBtb2RlbHMuPC9wPg0KICA8ZGl2IGNsYXNzPSJzb3VyY2UiPg0KICAgIDxwPlNvdXJjZTogSmV2QmVuY2ggdjEuNi4xIGFkanVzdGVkIG1lZGlhbiAocDUwKSBsYXRlbmN5LCBjaGVja2VkIE9jdCA3LCAyMDI2LjwvcD4NCiAgICA8cD4qIE1pY3Jvc29mdC1EZWNpc2lvbi0xIG1lYXN1cmVkIHRocm91Z2ggRm91bmRyeSBpbiB0aGUgc2FtZSByZWdpb24uPC9wPg0KICA8L2Rpdj4NCg0KICA8ZGl2IGNsYXNzPSJ0aXAiIGlkPSJ0aXAiIHJvbGU9InRvb2x0aXAiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2Rpdj4NCjwvZGl2Pg0KPHNjcmlwdD4NCihmdW5jdGlvbiAoKSB7DQogIHZhciBtb3Rpb24gPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpJykubWF0Y2hlczsNCiAgdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9vdCcpOw0KICB2YXIgdGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpcCcpOw0KDQogIGZ1bmN0aW9uIGVsKHRhZywgY2xzLCB0ZXh0KSB7DQogICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7DQogICAgaWYgKGNscykgbi5jbGFzc05hbWUgPSBjbHM7DQogICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCAmJiB0ZXh0ICE9PSBudWxsKSBuLnRleHRDb250ZW50ID0gdGV4dDsNCiAgICByZXR1cm4gbjsNCiAgfQ0KICBmdW5jdGlvbiBzZXRWYXIobiwgaywgdikgeyBuLnN0eWxlLnNldFByb3BlcnR5KGssIHYpOyB9DQogIGZ1bmN0aW9uIGZtdE4obiwgZCkgeyByZXR1cm4gbi50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkIH0pOyB9DQoNCiAgLy8gLS0tLSBUb29sdGlwIChob3Zlciwga2V5Ym9hcmQgZm9jdXMgYW5kIHRhcCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIHZhciBob3QgPSBudWxsOw0KICBmdW5jdGlvbiByZW5kZXJUaXAoc3BlYykgew0KICAgIHRpcC5pbm5lckhUTUwgPSAnJzsNCiAgICBpZiAoc3BlYy50aXRsZSkgdGlwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCAndCcsIHNwZWMudGl0bGUpKTsNCiAgICAoc3BlYy5yb3dzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7DQogICAgICB2YXIgcm93ID0gZWwoJ2RpdicsICdyJyArIChyWzJdID8gJyAnICsgclsyXSA6ICcnKSk7DQogICAgICByb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCBudWxsLCByWzBdKSk7DQogICAgICByb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAnbnVtJywgclsxXSkpOw0KICAgICAgdGlwLmFwcGVuZENoaWxkKHJvdyk7DQogICAgfSk7DQogICAgaWYgKHNwZWMubm90ZSkgdGlwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCAncycsIHNwZWMubm90ZSkpOw0KICB9DQogIGZ1bmN0aW9uIHBsYWNlVGlwKG5vZGUsIHByZWZlcikgew0KICAgIHZhciByciA9IHJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQogICAgdmFyIG5yID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICB2YXIgdHcgPSB0aXAub2Zmc2V0V2lkdGgsIHRoID0gdGlwLm9mZnNldEhlaWdodDsNCiAgICB2YXIgbGVmdCA9IG5yLmxlZnQgLSByci5sZWZ0ICsgKHByZWZlciA9PT0gJ2Fib3ZlJyA/IG5yLndpZHRoIC8gMiAtIHR3IC8gMiA6IDApOw0KICAgIGxlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZWZ0LCByci53aWR0aCAtIHR3KSk7DQogICAgdmFyIGJlbG93ID0gbnIuYm90dG9tIC0gcnIudG9wICsgNjsNCiAgICB2YXIgYWJvdmUgPSBuci50b3AgLSByci50b3AgLSB0aCAtIChwcmVmZXIgPT09ICdhYm92ZScgPyAyNiA6IDYpOw0KICAgIHZhciB0b3A7DQogICAgaWYgKHByZWZlciA9PT0gJ2Fib3ZlJykgdG9wID0gYWJvdmUgPj0gMCA/IGFib3ZlIDogTWF0aC5taW4oYmVsb3csIHJyLmhlaWdodCAtIHRoKTsNCiAgICBlbHNlIHRvcCA9IChiZWxvdyArIHRoIDw9IHJyLmhlaWdodCkgPyBiZWxvdyA6IE1hdGgubWF4KDAsIGFib3ZlKTsNCiAgICAvLyBTdGF5IGluc2lkZSB0aGUgd2lkZ2V0IHNvIHRoZSBhdXRvLXNpemVkIGZyYW1lIG5ldmVyIGNsaXBzIHRoZSB0aXAuDQogICAgdGlwLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JzsNCiAgICB0aXAuc3R5bGUudG9wID0gTWF0aC5tYXgoMCwgdG9wKSArICdweCc7DQogIH0NCiAgZnVuY3Rpb24gc2hvd1RpcChub2RlLCBidWlsZCwgcHJlZmVyKSB7DQogICAgaWYgKGhvdCA9PT0gbm9kZSkgcmV0dXJuOw0KICAgIGhpZGVUaXAoKTsNCiAgICBob3QgPSBub2RlOw0KICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnaG90Jyk7DQogICAgcmVuZGVyVGlwKGJ1aWxkKG5vZGUpKTsNCiAgICB0aXAuY2xhc3NMaXN0LmFkZCgnc2hvdycpOw0KICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7DQogICAgcGxhY2VUaXAobm9kZSwgcHJlZmVyKTsNCiAgfQ0KICBmdW5jdGlvbiBoaWRlVGlwKCkgew0KICAgIGlmIChob3QpIGhvdC5jbGFzc0xpc3QucmVtb3ZlKCdob3QnKTsNCiAgICBob3QgPSBudWxsOw0KICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7DQogICAgdGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOw0KICB9DQogIGZ1bmN0aW9uIGJpbmRUaXBzKHNlbGVjdG9yLCBidWlsZCwgcHJlZmVyKSB7DQogICAgZnVuY3Rpb24gZmluZCh0KSB7DQogICAgICB2YXIgbiA9IHQ7DQogICAgICB3aGlsZSAobiAmJiBuICE9PSByb290KSB7DQogICAgICAgIGlmIChuLm1hdGNoZXMgJiYgbi5tYXRjaGVzKHNlbGVjdG9yKSkgcmV0dXJuIG47DQogICAgICAgIG4gPSBuLnBhcmVudE5vZGU7DQogICAgICB9DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobikgc2hvd1RpcChuLCBidWlsZCwgcHJlZmVyKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuICYmICFuLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCkpIGhpZGVUaXAoKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSBmaW5kKGUudGFyZ2V0KTsgaWYgKG4pIHNob3dUaXAobiwgYnVpbGQsIHByZWZlcik7IH0pOw0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobiAmJiAhbi5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSBoaWRlVGlwKCk7IH0pOw0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGhpZGVUaXAoKTsgfSk7DQogIH0NCg0KICAvLyAtLS0tIENvdW50LXVwICh2aXNpYmlsaXR5LXRyaWdnZXJlZCB2aWEgcmV2ZWFsKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIHZhciBFQVNFID0gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gdCwgMyk7IH07DQogIGZ1bmN0aW9uIGNvdW50VXAobm9kZSwgdG8sIGZtdCwgbXMsIGRlbGF5KSB7DQogICAgaWYgKCFtb3Rpb24pIHsgbm9kZS50ZXh0Q29udGVudCA9IGZtdCh0byk7IHJldHVybjsgfQ0KICAgIHZhciBzdGFydCA9IG51bGw7DQogICAgbm9kZS50ZXh0Q29udGVudCA9IGZtdCgwKTsNCiAgICBmdW5jdGlvbiBmcmFtZShub3cpIHsNCiAgICAgIGlmIChzdGFydCA9PT0gbnVsbCkgc3RhcnQgPSBub3cgKyAoZGVsYXkgfHwgMCk7DQogICAgICB2YXIgdCA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIChub3cgLSBzdGFydCkgLyBtcykpOw0KICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGZtdCh0byAqIEVBU0UodCkpOw0KICAgICAgaWYgKHQgPCAxKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOw0KICAgIH0NCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOw0KICB9DQoNCiAgLy8gLS0tLSBSZXZlYWwgKEludGVyc2VjdGlvbk9ic2VydmVyIG9ubHk7IG5vIHRpbWVycyBzdGFydCBhbnl0aGluZykgLS0tLS0tDQogIC8vIGBzZXR0bGVkYCByZW1vdmVzIHN0YWdnZXIgZGVsYXlzIG9uY2UgdGhlIGVudHJhbmNlIGhhcyBwbGF5ZWQgc28gaG92ZXIsDQogIC8vIHRvZ2dsZXMgYW5kIGZpbHRlcnMgcmVzcG9uZCBpbW1lZGlhdGVseSBhZnRlcndhcmRzLg0KICBmdW5jdGlvbiByZXZlYWwoZ3JvdXAsIGNvdW50LCBjYikgew0KICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQoJ2luJyk7DQogICAgaWYgKGNiKSBjYigpOw0KICAgIGlmICghbW90aW9uKSB7IGdyb3VwLmNsYXNzTGlzdC5hZGQoJ3NldHRsZWQnKTsgcmV0dXJuOyB9DQogICAgdmFyIHdhaXQgPSBNYXRoLm1pbihjb3VudCwgMzApICogNDUgKyA3MDA7DQogICAgdmFyIHQwID0gcGVyZm9ybWFuY2Uubm93KCk7DQogICAgKGZ1bmN0aW9uIHRpY2sobm93KSB7IGlmIChub3cgLSB0MCA+PSB3YWl0KSBncm91cC5jbGFzc0xpc3QuYWRkKCdzZXR0bGVkJyk7IGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOyB9KSh0MCk7DQogIH0NCiAgZnVuY3Rpb24gb2JzZXJ2ZShpdGVtcykgeyAvLyBpdGVtczogW1tub2RlLCBmbl1dDQogICAgaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSB7DQogICAgICB2YXIgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHsNCiAgICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgaWYgKCFlLmlzSW50ZXJzZWN0aW5nKSByZXR1cm47DQogICAgICAgICAgaW8udW5vYnNlcnZlKGUudGFyZ2V0KTsNCiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyBpZiAoaXRbMF0gPT09IGUudGFyZ2V0KSBpdFsxXSgpOyB9KTsNCiAgICAgICAgfSk7DQogICAgICB9LCB7IHRocmVzaG9sZDogMC4wNSB9KTsNCiAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7IGlvLm9ic2VydmUoaXRbMF0pOyB9KTsNCiAgICB9IGVsc2Ugew0KICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsgaXRbMV0oKTsgfSk7DQogICAgfQ0KICB9DQogIHZhciBoZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWQnKTsNCg0KICB2YXIgREFUQSA9IHsNCiAgICBwcmltYXJ5OiAnTWljcm9zb2Z0LURlY2lzaW9uLTEnLA0KICAgIHJvd3M6IFsNCiAgICAgIC8vIG5hbWUsIHA1MCBtcywga2luZCwgcDk1IG1zDQogICAgICBbJ01pY3Jvc29mdC1EZWNpc2lvbi0xJywgODUsICdwcmknLCAxMjVdLA0KICAgICAgWydIMk8tTGlnaHRuaW5nLTRCIHYxLjEnLCAyMTBdLA0KICAgICAgWydKZXYgMS4xMy4wJywgMjQwXSwNCiAgICAgIFsnR1BULTYgTHVuYSBEZWNpc2lvbnMnLCAzMDBdLA0KICAgICAgWydRdXlldC0xLjAtTGFyZ2UnLCAzODBdLA0KICAgICAgWydTdXJvZ2F0ZSBSdW5lIDI2Qi1BNEInLCAzODBdLA0KICAgICAgWydkZWNrLTMxQicsIDQwMF0sDQogICAgICBbJ0dQVC02IFNvbCcsIDMwMTAsICdyZWYnXQ0KICAgIF0sDQogICAgc2NhbGVzOiB7DQogICAgICBsaW5lYXI6IHsgbWF4OiAzMTAwLCB0aWNrczogW1swLCAnMCddLCBbMTAwMCwgJzEgcyddLCBbMjAwMCwgJzIgcyddLCBbMzAwMCwgJzMgcyddXSB9LA0KICAgICAgbG9nOiB7IG1pbjogMjAsIG1heDogNDAwMCwgdGlja3M6IFtbMjAsICcyMCBtcyddLCBbNTAsICc1MCBtcyddLCBbMTAwLCAnMTAwIG1zJ10sIFsyMDAsICcyMDAgbXMnLCAxXSwgWzUwMCwgJzUwMCBtcycsIDFdLCBbMTAwMCwgJzEgcyddLCBbMjAwMCwgJzIgcycsIDFdLCBbMzAwMCwgJzMgcyddXSB9DQogICAgfQ0KICB9Ow0KDQogIGZ1bmN0aW9uIG1zKHYpIHsgcmV0dXJuIHYgPj0gMTAwMCA/IGZtdE4odiAvIDEwMDAsIDIpICsgJyBzJyA6IE1hdGgucm91bmQodikgKyAnIG1zJzsgfQ0KICB2YXIgc2NhbGUgPSAnbGluZWFyJzsNCiAgZnVuY3Rpb24gcGN0KHYpIHsNCiAgICB2YXIgcyA9IERBVEEuc2NhbGVzW3NjYWxlXTsNCiAgICBpZiAoc2NhbGUgPT09ICdsaW5lYXInKSByZXR1cm4gKHYgLyBzLm1heCkgKiAxMDA7DQogICAgcmV0dXJuIChNYXRoLmxvZyhNYXRoLm1heCh2LCBzLm1pbikgLyBzLm1pbikgLyBNYXRoLmxvZyhzLm1heCAvIHMubWluKSkgKiAxMDA7DQogIH0NCg0KICB2YXIgcm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb3dzJyk7DQogIHZhciBnY2VsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnY2VsbCcpOw0KICB2YXIgdGlja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGlja3MnKTsNCiAgdmFyIGNvdW50ZXJzID0gW107DQoNCiAgREFUQS5yb3dzLmZvckVhY2goZnVuY3Rpb24gKHIsIGkpIHsNCiAgICB2YXIgcm93ID0gZWwoJ2RpdicsICdyb3cnICsgKHJbMl0gPyAnICcgKyByWzJdIDogJycpKTsNCiAgICByb3cudGFiSW5kZXggPSAwOw0KICAgIHNldFZhcihyb3csICctLWknLCBTdHJpbmcoaSkpOw0KICAgIHJvdy5kYXRhc2V0LmkgPSBTdHJpbmcoaSk7DQogICAgdmFyIG5hbWUgPSBlbCgnZGl2JywgJ25hbWUnLCByWzBdKTsNCiAgICB2YXIgYXJlYSA9IGVsKCdkaXYnLCAnYXJlYScpOw0KICAgIHZhciB0cmFjayA9IGVsKCdkaXYnLCAndHJhY2snKTsNCiAgICB2YXIgZmlsbCA9IGVsKCdzcGFuJywgJ2ZpbGwnKTsNCiAgICB0cmFjay5hcHBlbmRDaGlsZChmaWxsKTsNCiAgICB2YXIgdmFsID0gZWwoJ3NwYW4nLCAndmFsIG51bScpOw0KICAgIGlmIChyWzNdKSB7DQogICAgICB2YXIgcDk1ID0gZWwoJ3NwYW4nLCAnZmlsbCBwOTUnKTsNCiAgICAgIHRyYWNrLmFwcGVuZENoaWxkKHA5NSk7DQogICAgICB2YXIgYSA9IGVsKCdzcGFuJyksIGFuID0gZWwoJ3NwYW4nLCBudWxsLCBtcyhyWzFdKSk7DQogICAgICB2YXIgYiA9IGVsKCdzcGFuJyksIGJuID0gZWwoJ3NwYW4nLCBudWxsLCBtcyhyWzNdKSk7DQogICAgICBhLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ3ByZScsICdwNTAgJykpOyBhLmFwcGVuZENoaWxkKGFuKTsNCiAgICAgIGIuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAncHJlJywgJ3A5NSAnKSk7IGIuYXBwZW5kQ2hpbGQoYm4pOyBiLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgJyonKSk7DQogICAgICB2YWwuYXBwZW5kQ2hpbGQoYSk7IHZhbC5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdzZXAnLCAnwrcnKSk7IHZhbC5hcHBlbmRDaGlsZChiKTsNCiAgICAgIGNvdW50ZXJzLnB1c2goW2FuLCByWzFdXSwgW2JuLCByWzNdXSk7DQogICAgfSBlbHNlIHsNCiAgICAgIGNvdW50ZXJzLnB1c2goW3ZhbCwgclsxXV0pOw0KICAgIH0NCiAgICB0cmFjay5hcHBlbmRDaGlsZCh2YWwpOw0KICAgIGFyZWEuYXBwZW5kQ2hpbGQodHJhY2spOw0KICAgIHJvdy5hcHBlbmRDaGlsZChuYW1lKTsNCiAgICByb3cuYXBwZW5kQ2hpbGQoYXJlYSk7DQogICAgcm93LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHJbMF0gKyAnOiBwNTAgJyArIG1zKHJbMV0pICsgKHJbM10gPyAnLCBwOTUgJyArIG1zKHJbM10pIDogJycpKTsNCiAgICByb3dzLmFwcGVuZENoaWxkKHJvdyk7DQogIH0pOw0KDQogIGZ1bmN0aW9uIGxheW91dCgpIHsNCiAgICB2YXIgcyA9IERBVEEuc2NhbGVzW3NjYWxlXTsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHJvd3MucXVlcnlTZWxlY3RvckFsbCgnLnJvdycpLCBmdW5jdGlvbiAocm93KSB7DQogICAgICB2YXIgciA9IERBVEEucm93c1srcm93LmRhdGFzZXQuaV07DQogICAgICB2YXIgdyA9IHBjdChyWzFdKSArICclJzsNCiAgICAgIHNldFZhcihyb3cucXVlcnlTZWxlY3RvcignLmZpbGwnKSwgJy0tdycsIHcpOw0KICAgICAgc2V0VmFyKHJvdy5xdWVyeVNlbGVjdG9yKCcudmFsJyksICctLXcnLCByWzNdID8gcGN0KHJbM10pICsgJyUnIDogdyk7DQogICAgICB2YXIgcDk1ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5wOTUnKTsNCiAgICAgIGlmIChwOTUpIHsgc2V0VmFyKHA5NSwgJy0tdzAnLCB3KTsgc2V0VmFyKHA5NSwgJy0tdycsIHBjdChyWzNdKSArICclJyk7IH0NCiAgICB9KTsNCiAgICBnY2VsbC5pbm5lckhUTUwgPSAnJzsgdGlja3MuaW5uZXJIVE1MID0gJyc7DQogICAgcy50aWNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7DQogICAgICB2YXIgcCA9IHBjdCh0WzBdKSArICclJzsNCiAgICAgIHZhciBnID0gZWwoJ3NwYW4nLCAnZ2wnKTsgc2V0VmFyKGcsICctLXAnLCBwKTsgZ2NlbGwuYXBwZW5kQ2hpbGQoZyk7DQogICAgICB2YXIgbCA9IGVsKCdzcGFuJywgdFsyXSA/ICdoaWRlLXNtJyA6IG51bGwsIHRbMV0pOyBzZXRWYXIobCwgJy0tcCcsIHApOyB0aWNrcy5hcHBlbmRDaGlsZChsKTsNCiAgICB9KTsNCiAgfQ0KICBsYXlvdXQoKTsNCg0KICAvLyBTY2FsZSB0b2dnbGUNCiAgdmFyIHRvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2FsZScpOw0KICB0b2dnbGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgew0KICAgIHZhciBiID0gZS50YXJnZXQuY2xvc2VzdCgnYnV0dG9uJyk7DQogICAgaWYgKCFiIHx8IGIuZGF0YXNldC5zY2FsZSA9PT0gc2NhbGUpIHJldHVybjsNCiAgICBzY2FsZSA9IGIuZGF0YXNldC5zY2FsZTsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRvZ2dsZS5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKSwgZnVuY3Rpb24gKHgpIHsgeC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHggPT09IGIgPyAndHJ1ZScgOiAnZmFsc2UnKTsgfSk7DQogICAgbGF5b3V0KCk7DQogICAgaGlkZVRpcCgpOw0KICB9KTsNCg0KICAvLyBUb29sdGlwDQogIGJpbmRUaXBzKCcucm93JywgZnVuY3Rpb24gKHJvdykgew0KICAgIHZhciByID0gREFUQS5yb3dzWytyb3cuZGF0YXNldC5pXTsNCiAgICB2YXIgYmFzZSA9IERBVEEucm93c1swXVsxXTsNCiAgICB2YXIgc3BlYyA9IHsgdGl0bGU6IHJbMF0sIHJvd3M6IFtbJ3A1MCBsYXRlbmN5JywgbXMoclsxXSksIHJbMl0gPT09ICdwcmknID8gJ2hpJyA6ICcnXV0gfTsNCiAgICBpZiAoclszXSkgew0KICAgICAgc3BlYy5yb3dzLnB1c2goWydwOTUgbGF0ZW5jeScsIG1zKHJbM10pXSk7DQogICAgICBzcGVjLm5vdGUgPSAnSGFsZiBvZiByZXF1ZXN0cyByZXR1cm4gd2l0aGluICcgKyBtcyhyWzFdKSArICcgYW5kIDk1JSB3aXRoaW4gJyArIG1zKHJbM10pICsgJy4nOw0KICAgIH0gZWxzZSB7DQogICAgICBzcGVjLnJvd3MucHVzaChbJ3ZzICcgKyBEQVRBLnByaW1hcnksIGZtdE4oclsxXSAvIGJhc2UsIHJbMV0gLyBiYXNlID49IDEwID8gMCA6IDEpICsgJ8OXIHNsb3dlciddKTsNCiAgICAgIHNwZWMubm90ZSA9IHJbMl0gPT09ICdyZWYnID8gJ0Zyb250aWVyIHJlZmVyZW5jZSBtb2RlbC4nIDogJ0FkanVzdGVkIG1lZGlhbiBsYXRlbmN5IG9uIEpldkJlbmNoLic7DQogICAgfQ0KICAgIHJldHVybiBzcGVjOw0KICB9KTsNCg0KICAvLyBNb3Rpb24NCiAgdmFyIGNoYXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0Jyk7DQogIG9ic2VydmUoWw0KICAgIFtoZWFkLCBmdW5jdGlvbiAoKSB7IGhlYWQuY2xhc3NMaXN0LmFkZCgnaW4nKTsgfV0sDQogICAgW2NoYXJ0LCBmdW5jdGlvbiAoKSB7DQogICAgICByZXZlYWwoY2hhcnQsIERBVEEucm93cy5sZW5ndGgsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgY291bnRlcnMuZm9yRWFjaChmdW5jdGlvbiAoYywgaSkgeyBjb3VudFVwKGNbMF0sIGNbMV0sIG1zLCA4MDAsIDApOyB9KTsNCiAgICAgIH0pOw0KICAgIH1dDQogIF0pOw0KDQp9KSgpOw0KPC9zY3JpcHQ+DQo8L2JvZHk+DQo8L2h0bWw+DQo=

2. Quality that generalizes

It’s easy to overfit a model for one benchmark or one type of decision task. We need to know whether that quality carries over to various tasks the model wasn’t trained on. That’s why we evaluated Microsoft-Decision-1 across dozens of benchmarks kept blinded from training, spanning routing, ranking, long context, multilingual and out-of-distribution tasks, reasoning, and safety. We also took several of the top public models on the popular open leaderboard JevBench and tested them across 36 additional public and private benchmarks. Microsoft-Decision-1 performed the best across these broader sets of benchmarks, demonstrating strong generalization.

PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIgY29udGVudD0iZGVmYXVsdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJyAndW5zYWZlLWV2YWwnOyBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnOyBpbWctc3JjIGRhdGE6IGJsb2I6IGh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3VwbG9hZHMvOyBmb250LXNyYyBkYXRhOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb207IG1lZGlhLXNyYyBkYXRhOiBibG9iOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC91cGxvYWRzLzsiPg0KPG1ldGEgY2hhcnNldD0idXRmLTgiPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4NCjx0aXRsZT5BdmVyYWdlIGFjY3VyYWN5PC90aXRsZT4NCjxzdHlsZT4NCkBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1Cb29rLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLU1lZGl1bS5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1Cb2xkLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLUl0YWxpYy5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IkNhc2NhZGlhIENvZGUiO2ZvbnQtd2VpZ2h0OjIwMCA3MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvQ2FzY2FkaWFDb2RlLndvZmYyIikgZm9ybWF0KCJ3b2ZmMiIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJDYXNjYWRpYSBDb2RlIjtmb250LXdlaWdodDoyMDAgNzAwO2ZvbnQtc3R5bGU6aXRhbGljO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL0Nhc2NhZGlhQ29kZUl0YWxpYy53b2ZmMiIpIGZvcm1hdCgid29mZjIiKTt9DQo6cm9vdCB7DQogIC0tYmc6ICNmZmY7DQogIC0taW5rOiAjMDAwOw0KICAtLW11dGVkOiAjNTU1Ow0KICAtLWZhaW50OiAjYzljOWM5OyAgICAgICAgLyogc2Vjb25kYXJ5IHNlcmllcyAqLw0KICAtLWdvb2Q6ICNFM0Y2NzE7ICAgICAgICAgLyogcHJpbWFyeSBtb2RlbCAoc2l0ZSBhY2NlbnQgbGltZSkgKi8NCiAgLS1iYWQ6ICNGRkEwMzc7ICAgICAgICAgIC8qIHByaW1hcnkgbW9kZWwgYmVoaW5kIChzaXRlIGFjY2VudCBvcmFuZ2UpICovDQogIC0tcnVsZTogIzAwMDsNCiAgLS1ydWxlLXNvZnQ6ICNlNmU2ZTY7DQogIC0taG92ZXI6ICNmM2YzZjM7DQogIC0tYmFkZ2UtYmc6ICMwMDA7DQogIC0tYmFkZ2UtZmc6ICNmZmY7DQogIC0tdGlwLWJnOiAjMDAwOw0KICAtLXRpcC1mZzogI2ZmZjsNCiAgLS1zYW5zOiAiUFAgTmV1ZSBNb250cmVhbCIsIHNhbnMtc2VyaWY7DQogIC0tbW9ubzogIkNhc2NhZGlhIENvZGUiLCB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgIkxpYmVyYXRpb24gTW9ubyIsIG1vbm9zcGFjZTsNCn0NCmh0bWxbZGF0YS10aGVtZT0iZGFyayJdIHsNCiAgLS1iZzogIzExMTsNCiAgLS1pbms6ICNmZmY7DQogIC0tbXV0ZWQ6ICM5OTk7DQogIC0tZmFpbnQ6ICM0NDQ7DQogIC0tcnVsZTogI2ZmZjsNCiAgLS1ydWxlLXNvZnQ6ICMyYTJhMmE7DQogIC0taG92ZXI6ICMxZjFmMWY7DQogIC0tYmFkZ2UtYmc6ICNmZmY7DQogIC0tYmFkZ2UtZmc6ICMxMTE7DQogIC0tdGlwLWJnOiAjZmZmOw0KICAtLXRpcC1mZzogIzExMTsNCn0NCg0KKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0NCmJvZHkgew0KICBtYXJnaW46IDA7DQogIGJhY2tncm91bmQ6IHZhcigtLWJnKTsNCiAgY29sb3I6IHZhcigtLWluayk7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1zYW5zKTsNCiAgZm9udC1zaXplOiAxNXB4Ow0KICBsaW5lLWhlaWdodDogMS40NTsNCiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7DQp9DQoud3JhcCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogMnB4IDAgNnB4OyB9DQoubnVtIHsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOyB9DQouayB7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC1zaXplOiAxMXB4Ow0KICBsZXR0ZXItc3BhY2luZzogMC4wNmVtOw0KICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOw0KICBjb2xvcjogdmFyKC0tbXV0ZWQpOw0KfQ0KYnV0dG9uIHsgZm9udDogaW5oZXJpdDsgY29sb3I6IGluaGVyaXQ7IGJhY2tncm91bmQ6IG5vbmU7IGJvcmRlcjogMDsgcGFkZGluZzogMDsgY3Vyc29yOiBwb2ludGVyOyB9DQpidXR0b246Zm9jdXMtdmlzaWJsZSwgW3RhYmluZGV4XTpmb2N1cy12aXNpYmxlIHsgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWluayk7IG91dGxpbmUtb2Zmc2V0OiAycHg7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gSGVhZGVyID09PT09PT09PT09PT09PT09ICovDQouaGVhZCB7IG1hcmdpbi1ib3R0b206IDI4cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgfQ0KLmJhZGdlIHsNCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICBwYWRkaW5nOiA0cHggOHB4Ow0KICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWRnZS1iZyk7DQogIGNvbG9yOiB2YXIoLS1iYWRnZS1mZyk7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC1zaXplOiAxMHB4Ow0KICBsaW5lLWhlaWdodDogMTsNCiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsNCiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCn0NCmgxIHsNCiAgbWFyZ2luOiAxOHB4IDAgOHB4Ow0KICBmb250LXNpemU6IGNsYW1wKDI0cHgsIDQuMnZ3LCAzMnB4KTsNCiAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxNWVtOw0KICBsaW5lLWhlaWdodDogMS4xMjsNCn0NCi5zdWIgeyBtYXJnaW46IDAgYXV0bzsgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMS41OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXgtd2lkdGg6IDYyY2g7IH0NCi5zdWIgLmRpciB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNTAwOyB9DQoNCi8qID09PT09PT09PT09PT09PT09IExlZ2VuZCAvIHRvZ2dsZXMgPT09PT09PT09PT09PT09PT0gKi8NCi5jb250cm9scyB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGZsZXgtd3JhcDogd3JhcDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICBnYXA6IDEwcHggMjRweDsNCiAgbWFyZ2luLWJvdHRvbTogMThweDsNCn0NCi5sZWdlbmQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNHB4IDZweDsgfQ0KLmxlZ2VuZCBidXR0b24sIC50b2dnbGUgYnV0dG9uIHsNCiAgZGlzcGxheTogaW5saW5lLWZsZXg7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIGdhcDogOHB4Ow0KICBwYWRkaW5nOiA1cHggMTFweDsNCiAgZm9udC1zaXplOiAxM3B4Ow0KICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ydWxlLXNvZnQpOw0KICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMgZWFzZSwgYmFja2dyb3VuZCAwLjE1cyBlYXNlLCBvcGFjaXR5IDAuMnMgZWFzZTsNCn0NCi5sZWdlbmQgYnV0dG9uOmhvdmVyLCAudG9nZ2xlIGJ1dHRvbjpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQ0KLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl0geyBib3JkZXItY29sb3I6IHZhcigtLWluayk7IGZvbnQtd2VpZ2h0OiA1MDA7IH0NCi5sZWdlbmQgLnN3IHsgd2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDsgZmxleDogMCAwIDEwcHg7IH0NCi5sZWdlbmQgLnN3LnByaSB7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyB9DQoubGVnZW5kIC5zdy5yZWYgeyBiYWNrZ3JvdW5kOiB2YXIoLS1pbmspOyB9DQoubGVnZW5kIC5zdy5vdGggeyBiYWNrZ3JvdW5kOiB2YXIoLS1mYWludCk7IH0NCi5sZWdlbmQuaXNvIGJ1dHRvbjpub3QoW2FyaWEtcHJlc3NlZD0idHJ1ZSJdKSB7IG9wYWNpdHk6IDAuNDU7IH0NCi5sZWdlbmQgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdOjphZnRlciB7IGNvbnRlbnQ6ICLCtyBjbGljayB0byBjbGVhciI7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi50b2dnbGUgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDRweDsgfQ0KLnRvZ2dsZSAuayB7IG1hcmdpbi1yaWdodDogOHB4OyB9DQoudG9nZ2xlIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXSB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IGNvbG9yOiB2YXIoLS1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBOb3RlcyAvIHNvdXJjZSA9PT09PT09PT09PT09PT09PSAqLw0KLm5vdGUgeyBtYXJnaW46IDE2cHggMCAwOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjU7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi5ub3RlIC5udW0geyBjb2xvcjogdmFyKC0taW5rKTsgfQ0KLnNvdXJjZSB7IG1hcmdpbi10b3A6IDMycHg7IHBhZGRpbmctdG9wOiAxNHB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tcnVsZS1zb2Z0KTsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS41NTsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLnNvdXJjZSBwIHsgbWFyZ2luOiAwIDAgNHB4OyB9DQoNCi8qID09PT09PT09PT09PT09PT09IFRvb2x0aXAgPT09PT09PT09PT09PT09PT0gKi8NCi50aXAgew0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIHotaW5kZXg6IDI7DQogIG1heC13aWR0aDogMzAwcHg7DQogIHBhZGRpbmc6IDEwcHggMTJweDsNCiAgYmFja2dyb3VuZDogdmFyKC0tdGlwLWJnKTsNCiAgY29sb3I6IHZhcigtLXRpcC1mZyk7DQogIGZvbnQtc2l6ZTogMTNweDsNCiAgbGluZS1oZWlnaHQ6IDEuNDsNCiAgcG9pbnRlci1ldmVudHM6IG5vbmU7DQogIG9wYWNpdHk6IDA7DQogIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xMnMgZWFzZTsNCn0NCi50aXAuc2hvdyB7IG9wYWNpdHk6IDE7IH0NCi50aXAgLnQgeyBmb250LXdlaWdodDogNTAwOyBtYXJnaW4tYm90dG9tOiA2cHg7IH0NCi50aXAgLnIgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGdhcDogMTZweDsgfQ0KLnRpcCAuciArIC5yIHsgbWFyZ2luLXRvcDogMnB4OyB9DQoudGlwIC5yLmhpIHsgZm9udC13ZWlnaHQ6IDcwMDsgfQ0KLnRpcCAuci5oaSA+IHNwYW46Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4OyBtYXJnaW4tcmlnaHQ6IDhweDsgdmVydGljYWwtYWxpZ246IDFweDsgYmFja2dyb3VuZDogdmFyKC0tZ29vZCk7IH0NCi50aXAgLnIuaGkuYiA+IHNwYW46Zmlyc3QtY2hpbGQ6OmJlZm9yZSB7IGJhY2tncm91bmQ6IHZhcigtLWJhZCk7IH0NCi50aXAgLnMgeyBtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmctdG9wOiA2cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tdGlwLWZnKSAyNSUsIHRyYW5zcGFyZW50KTsgZm9udC1zaXplOiAxMnB4OyBvcGFjaXR5OiAwLjg1OyB9DQoNCi8qID09PT09PT09PT09PT09PT09IE1vdGlvbiAoc2hhcmVkKSA9PT09PT09PT09PT09PT09PSAqLw0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7DQogIC5oZWFkIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IHRyYW5zaXRpb246IG9wYWNpdHkgMC41cyBlYXNlLCB0cmFuc2Zvcm0gMC41cyBlYXNlOyB9DQogIC5oZWFkLmluIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9DQp9DQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgew0KICAqIHsgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OyB9DQp9DQpAbWVkaWEgKG1heC13aWR0aDogNTYwcHgpIHsNCiAgLmhlYWQgeyBtYXJnaW4tYm90dG9tOiAyMnB4OyB9DQogIC5zdWIgeyBmb250LXNpemU6IDE1cHg7IH0NCiAgLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl06OmFmdGVyIHsgY29udGVudDogIsK3IHRhcCB0byBjbGVhciI7IH0NCn0NCg0KLyogPT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBiYXJzID09PT09PT09PT09PT09PT09ICovDQouaGJhciB7IC0tbmFtZS13OiAyMjBweDsgLS1ndXR0ZXI6IDcycHg7IC0tZ2FwOiAxNnB4OyB9DQoucm93cyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQ0KLmdyaWRsaW5lcywgLmF4aXMgew0KICBkaXNwbGF5OiBncmlkOw0KICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLW5hbWUtdykgbWlubWF4KDAsIDFmcik7DQogIGdhcDogMCB2YXIoLS1nYXApOw0KfQ0KLmdyaWRsaW5lcyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgaW5zZXQ6IDA7IHBvaW50ZXItZXZlbnRzOiBub25lOyB9DQouZ2NlbGwsIC50aWNrcyB7IGdyaWQtY29sdW1uOiAyOyBwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbi1yaWdodDogdmFyKC0tZ3V0dGVyKTsgfQ0KLmdsIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGJvdHRvbTogMDsgbGVmdDogdmFyKC0tcCk7IHdpZHRoOiAxcHg7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUtc29mdCk7IH0NCi5nbDpmaXJzdC1jaGlsZCB7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUpOyB6LWluZGV4OiAxOyB9IC8qIGJhc2VsaW5lIHNpdHMgYWJvdmUgdGhlIGZpbGxzIHNvIGl0IHJlYWRzIGFzIG9uZSBsaW5lICovDQoucm93IHsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICBkaXNwbGF5OiBncmlkOw0KICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLW5hbWUtdykgbWlubWF4KDAsIDFmcik7DQogIGdhcDogMCB2YXIoLS1nYXApOw0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KICBwYWRkaW5nOiA2cHggMDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7DQp9DQoucm93OmhvdmVyLCAucm93OmZvY3VzLXdpdGhpbiwgLnJvdy5ob3QgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ob3Zlcik7IH0NCi5yb3c6aG92ZXIgLm5hbWUsIC5yb3cuaG90IC5uYW1lIHsgY29sb3I6IHZhcigtLWluayk7IH0NCi5uYW1lIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogMTQuNXB4OyBsaW5lLWhlaWdodDogMS4zOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsgfQ0KLnJvdy5wcmkgLm5hbWUsIC5yb3cucmVmIC5uYW1lIHsgY29sb3I6IHZhcigtLWluayk7IH0NCi5yb3cucHJpIC5uYW1lIHsgZm9udC13ZWlnaHQ6IDcwMDsgfQ0KLnJvdy5yZWYgLm5hbWUgeyBmb250LXdlaWdodDogNTAwOyB9DQoubmFtZSAuc3VibCB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tdG9wOiAycHg7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC1zaXplOiAxMXB4OyBsZXR0ZXItc3BhY2luZzogMC4wMmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9DQouYXJlYSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy1yaWdodDogdmFyKC0tZ3V0dGVyKTsgfQ0KLnRyYWNrIHsgcG9zaXRpb246IHJlbGF0aXZlOyBoZWlnaHQ6IDIycHg7IH0NCi5maWxsIHsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgd2lkdGg6IHZhcigtLXcpOyBiYWNrZ3JvdW5kOiB2YXIoLS1mYWludCk7IHRyYW5zaXRpb246IHdpZHRoIDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7IH0NCi5yb3cucHJpIC5maWxsIHsgYmFja2dyb3VuZDogdmFyKC0tZ29vZCk7IH0NCi5yb3cucmVmIC5maWxsIHsgYmFja2dyb3VuZDogdmFyKC0taW5rKTsgfQ0KLnJvdy5wcmkgLmZpbGwucDk1IHsNCiAgbGVmdDogdmFyKC0tdzApOw0KICB3aWR0aDogY2FsYyh2YXIoLS13KSAtIHZhcigtLXcwKSk7DQogIGJhY2tncm91bmQ6IHJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1nb29kKSAwIDNweCwgdHJhbnNwYXJlbnQgM3B4IDZweCk7DQp9DQoudmFsIHsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBsZWZ0OiBjYWxjKHZhcigtLXcpICsgOHB4KTsNCiAgdG9wOiA1MCU7DQogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsNCiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgZm9udC1zaXplOiAxM3B4Ow0KICBjb2xvcjogdmFyKC0tbXV0ZWQpOw0KICB0cmFuc2l0aW9uOiBsZWZ0IDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7DQp9DQoucm93LnByaSAudmFsLCAucm93LnJlZiAudmFsIHsgY29sb3I6IHZhcigtLWluayk7IGZvbnQtd2VpZ2h0OiA3MDA7IH0NCi52YWwgLnNlcCB7IG1hcmdpbjogMCA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtd2VpZ2h0OiA0MDA7IH0NCi50aWNrcyB7IGhlaWdodDogMjBweDsgbWFyZ2luLXRvcDogNnB4OyB9DQoudGlja3Mgc3BhbiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogdmFyKC0tcCk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXNpemU6IDExcHg7IGxldHRlci1zcGFjaW5nOiAwLjA0ZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCi50aWNrcyBzcGFuOmZpcnN0LWNoaWxkIHsgdHJhbnNmb3JtOiBub25lOyB9DQoNCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSkgew0KICAucmV2ZWFsIC5maWxsIHsgdHJhbnNmb3JtOiBzY2FsZVgoMCk7IHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOyB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC41NXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksIHdpZHRoIDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0NW1zKTsgfQ0KICAucmV2ZWFsLmluIC5maWxsIHsgdHJhbnNmb3JtOiBub25lOyB9DQogIC5yZXZlYWwgLnZhbCB7IG9wYWNpdHk6IDA7IHRyYW5zaXRpb246IG9wYWNpdHkgMC40cyBlYXNlLCBsZWZ0IDAuNXMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSk7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0NW1zICsgMjUwbXMpOyB9DQogIC5yZXZlYWwuaW4gLnZhbCB7IG9wYWNpdHk6IDE7IH0NCiAgLnJldmVhbCAucm93IHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC02cHgpOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMzVzIGVhc2UsIHRyYW5zZm9ybSAwLjM1cyBlYXNlLCBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0NW1zKTsgfQ0KICAucmV2ZWFsLmluIC5yb3cgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7IH0NCiAgLnJldmVhbC5pbi5zZXR0bGVkIC5maWxsLCAucmV2ZWFsLmluLnNldHRsZWQgLnZhbCwgLnJldmVhbC5pbi5zZXR0bGVkIC5yb3cgeyB0cmFuc2l0aW9uLWRlbGF5OiAwczsgfQ0KICAucmV2ZWFsLmluLnNldHRsZWQgLnJvdyB7IHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTsgfQ0KfQ0KDQpAbWVkaWEgKG1heC13aWR0aDogOTAwcHgpIHsgLmhiYXIgeyAtLW5hbWUtdzogMTcwcHg7IH0gfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDcwMHB4KSB7IC5oYmFyIHsgLS1uYW1lLXc6IDE0MHB4OyAtLWdhcDogMTJweDsgfSAubmFtZSB7IGZvbnQtc2l6ZTogMTMuNXB4OyB9IC52YWwgeyBmb250LXNpemU6IDEycHg7IH0gfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDQ4MHB4KSB7DQogIC5oYmFyIHsgLS1uYW1lLXc6IDEwNHB4OyAtLWd1dHRlcjogNTZweDsgLS1nYXA6IDEwcHg7IH0NCiAgLnZhbCAucHJlIHsgZGlzcGxheTogbm9uZTsgfQ0KICAubmFtZSB7IGZvbnQtc2l6ZTogMTIuNXB4OyB9DQogIC5uYW1lIC5zdWJsIHsgZm9udC1zaXplOiAxMHB4OyB9DQogIC52YWwgeyBmb250LXNpemU6IDExcHg7IH0NCiAgLnZhbCAuc2VwIHsgbWFyZ2luOiAwIDRweDsgfQ0KICAudHJhY2sgeyBoZWlnaHQ6IDE4cHg7IH0NCiAgLnRpY2tzIHNwYW4geyBmb250LXNpemU6IDEwcHg7IH0NCiAgLnRpY2tzIHNwYW4uaGlkZS1zbSB7IGRpc3BsYXk6IG5vbmU7IH0NCn0NCi5oYmFyIHsgLS1ndXR0ZXI6IDY0cHg7IH0gQG1lZGlhIChtYXgtd2lkdGg6IDQ4MHB4KSB7IC5oYmFyIHsgLS1ndXR0ZXI6IDQ4cHg7IH0gfTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxkaXYgY2xhc3M9IndyYXAiIGlkPSJyb290Ij4NCiAgPGhlYWRlciBjbGFzcz0iaGVhZCI+DQogICAgPHNwYW4gY2xhc3M9ImJhZGdlIj5BY2N1cmFjeTwvc3Bhbj4NCiAgICA8aDE+QXZlcmFnZSBhY2N1cmFjeSBvdmVyIDM2IGJlbmNobWFya3M8L2gxPg0KICAgIDxwIGNsYXNzPSJzdWIiPjxzcGFuIGNsYXNzPSJkaXIiPkhpZ2hlciBpcyBiZXR0ZXIuPC9zcGFuPiBNZWFuIHNjb3JlIGFjcm9zcyA8c3BhbiBjbGFzcz0ibnVtIj4xNDcsMTM3PC9zcGFuPiBxdWVzdGlvbnMuPC9wPg0KICA8L2hlYWRlcj4NCg0KICA8ZGl2IGNsYXNzPSJoYmFyIHJldmVhbCIgaWQ9ImNoYXJ0Ij4NCiAgICA8ZGl2IGNsYXNzPSJyb3dzIiBpZD0icm93cyI+DQogICAgICA8ZGl2IGNsYXNzPSJncmlkbGluZXMiIGFyaWEtaGlkZGVuPSJ0cnVlIj48ZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdjZWxsIiBpZD0iZ2NlbGwiPjwvZGl2PjwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgIDxkaXYgY2xhc3M9ImF4aXMiIGFyaWEtaGlkZGVuPSJ0cnVlIj48ZGl2PjwvZGl2PjxkaXYgY2xhc3M9InRpY2tzIiBpZD0idGlja3MiPjwvZGl2PjwvZGl2Pg0KICA8L2Rpdj4NCiAgPGRpdiBjbGFzcz0ic291cmNlIj4NCiAgICA8cD4jbiA9IHBvc2l0aW9uIG9uIHRoZSBKZXZCZW5jaCBsZWFkZXJib2FyZCwgOCBPY3RvYmVyIDIwMjYuPC9wPg0KICAgIDxwPiogU3RyYW5kcy1EZWNpZGVyIDJCJ3Mgc2NvcmUgaXMgaXRzIGF2ZXJhZ2Ugb3ZlciBvbmx5IHRoZSAyMyBvZiAzNiBiZW5jaG1hcmtzIGl0IGNvdWxkIGFuc3dlci48L3A+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InRpcCIgaWQ9InRpcCIgcm9sZT0idG9vbHRpcCIgYXJpYS1oaWRkZW49InRydWUiPjwvZGl2Pg0KPC9kaXY+DQo8c2NyaXB0Pg0KKGZ1bmN0aW9uICgpIHsNCiAgdmFyIG1vdGlvbiA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSknKS5tYXRjaGVzOw0KICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290Jyk7DQogIHZhciB0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGlwJyk7DQoNCiAgZnVuY3Rpb24gZWwodGFnLCBjbHMsIHRleHQpIHsNCiAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsNCiAgICBpZiAoY2xzKSBuLmNsYXNzTmFtZSA9IGNsczsNCiAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkICYmIHRleHQgIT09IG51bGwpIG4udGV4dENvbnRlbnQgPSB0ZXh0Ow0KICAgIHJldHVybiBuOw0KICB9DQogIGZ1bmN0aW9uIHNldFZhcihuLCBrLCB2KSB7IG4uc3R5bGUuc2V0UHJvcGVydHkoaywgdik7IH0NCiAgZnVuY3Rpb24gZm10TihuLCBkKSB7IHJldHVybiBuLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGQgfSk7IH0NCg0KICAvLyAtLS0tIFRvb2x0aXAgKGhvdmVyLCBrZXlib2FyZCBmb2N1cyBhbmQgdGFwKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgdmFyIGhvdCA9IG51bGw7DQogIGZ1bmN0aW9uIHJlbmRlclRpcChzcGVjKSB7DQogICAgdGlwLmlubmVySFRNTCA9ICcnOw0KICAgIGlmIChzcGVjLnRpdGxlKSB0aXAuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICd0Jywgc3BlYy50aXRsZSkpOw0KICAgIChzcGVjLnJvd3MgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHIpIHsNCiAgICAgIHZhciByb3cgPSBlbCgnZGl2JywgJ3InICsgKHJbMl0gPyAnICcgKyByWzJdIDogJycpKTsNCiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIG51bGwsIHJbMF0pKTsNCiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdudW0nLCByWzFdKSk7DQogICAgICB0aXAuYXBwZW5kQ2hpbGQocm93KTsNCiAgICB9KTsNCiAgICBpZiAoc3BlYy5ub3RlKSB0aXAuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdzJywgc3BlYy5ub3RlKSk7DQogIH0NCiAgZnVuY3Rpb24gcGxhY2VUaXAobm9kZSwgcHJlZmVyKSB7DQogICAgdmFyIHJyID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICB2YXIgbnIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KICAgIHZhciB0dyA9IHRpcC5vZmZzZXRXaWR0aCwgdGggPSB0aXAub2Zmc2V0SGVpZ2h0Ow0KICAgIHZhciBsZWZ0ID0gbnIubGVmdCAtIHJyLmxlZnQgKyAocHJlZmVyID09PSAnYWJvdmUnID8gbnIud2lkdGggLyAyIC0gdHcgLyAyIDogMCk7DQogICAgbGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxlZnQsIHJyLndpZHRoIC0gdHcpKTsNCiAgICB2YXIgYmVsb3cgPSBuci5ib3R0b20gLSByci50b3AgKyA2Ow0KICAgIHZhciBhYm92ZSA9IG5yLnRvcCAtIHJyLnRvcCAtIHRoIC0gKHByZWZlciA9PT0gJ2Fib3ZlJyA/IDI2IDogNik7DQogICAgdmFyIHRvcDsNCiAgICBpZiAocHJlZmVyID09PSAnYWJvdmUnKSB0b3AgPSBhYm92ZSA+PSAwID8gYWJvdmUgOiBNYXRoLm1pbihiZWxvdywgcnIuaGVpZ2h0IC0gdGgpOw0KICAgIGVsc2UgdG9wID0gKGJlbG93ICsgdGggPD0gcnIuaGVpZ2h0KSA/IGJlbG93IDogTWF0aC5tYXgoMCwgYWJvdmUpOw0KICAgIC8vIFN0YXkgaW5zaWRlIHRoZSB3aWRnZXQgc28gdGhlIGF1dG8tc2l6ZWQgZnJhbWUgbmV2ZXIgY2xpcHMgdGhlIHRpcC4NCiAgICB0aXAuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnOw0KICAgIHRpcC5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCB0b3ApICsgJ3B4JzsNCiAgfQ0KICBmdW5jdGlvbiBzaG93VGlwKG5vZGUsIGJ1aWxkLCBwcmVmZXIpIHsNCiAgICBpZiAoaG90ID09PSBub2RlKSByZXR1cm47DQogICAgaGlkZVRpcCgpOw0KICAgIGhvdCA9IG5vZGU7DQogICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdob3QnKTsNCiAgICByZW5kZXJUaXAoYnVpbGQobm9kZSkpOw0KICAgIHRpcC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7DQogICAgdGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTsNCiAgICBwbGFjZVRpcChub2RlLCBwcmVmZXIpOw0KICB9DQogIGZ1bmN0aW9uIGhpZGVUaXAoKSB7DQogICAgaWYgKGhvdCkgaG90LmNsYXNzTGlzdC5yZW1vdmUoJ2hvdCcpOw0KICAgIGhvdCA9IG51bGw7DQogICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsNCiAgICB0aXAuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7DQogIH0NCiAgZnVuY3Rpb24gYmluZFRpcHMoc2VsZWN0b3IsIGJ1aWxkLCBwcmVmZXIpIHsNCiAgICBmdW5jdGlvbiBmaW5kKHQpIHsNCiAgICAgIHZhciBuID0gdDsNCiAgICAgIHdoaWxlIChuICYmIG4gIT09IHJvb3QpIHsNCiAgICAgICAgaWYgKG4ubWF0Y2hlcyAmJiBuLm1hdGNoZXMoc2VsZWN0b3IpKSByZXR1cm4gbjsNCiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuKSBzaG93VGlwKG4sIGJ1aWxkLCBwcmVmZXIpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSBmaW5kKGUudGFyZ2V0KTsgaWYgKG4gJiYgIW4uY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSkgaGlkZVRpcCgpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobikgc2hvd1RpcChuLCBidWlsZCwgcHJlZmVyKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuICYmICFuLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCkpIGhpZGVUaXAoKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgaGlkZVRpcCgpOyB9KTsNCiAgfQ0KDQogIC8vIC0tLS0gQ291bnQtdXAgKHZpc2liaWxpdHktdHJpZ2dlcmVkIHZpYSByZXZlYWwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgdmFyIEVBU0UgPSBmdW5jdGlvbiAodCkgeyByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCAzKTsgfTsNCiAgZnVuY3Rpb24gY291bnRVcChub2RlLCB0bywgZm10LCBtcywgZGVsYXkpIHsNCiAgICBpZiAoIW1vdGlvbikgeyBub2RlLnRleHRDb250ZW50ID0gZm10KHRvKTsgcmV0dXJuOyB9DQogICAgdmFyIHN0YXJ0ID0gbnVsbDsNCiAgICBub2RlLnRleHRDb250ZW50ID0gZm10KDApOw0KICAgIGZ1bmN0aW9uIGZyYW1lKG5vdykgew0KICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKSBzdGFydCA9IG5vdyArIChkZWxheSB8fCAwKTsNCiAgICAgIHZhciB0ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgKG5vdyAtIHN0YXJ0KSAvIG1zKSk7DQogICAgICBub2RlLnRleHRDb250ZW50ID0gZm10KHRvICogRUFTRSh0KSk7DQogICAgICBpZiAodCA8IDEpIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7DQogICAgfQ0KICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7DQogIH0NCg0KICAvLyAtLS0tIFJldmVhbCAoSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgb25seTsgbm8gdGltZXJzIHN0YXJ0IGFueXRoaW5nKSAtLS0tLS0NCiAgLy8gYHNldHRsZWRgIHJlbW92ZXMgc3RhZ2dlciBkZWxheXMgb25jZSB0aGUgZW50cmFuY2UgaGFzIHBsYXllZCBzbyBob3ZlciwNCiAgLy8gdG9nZ2xlcyBhbmQgZmlsdGVycyByZXNwb25kIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuDQogIGZ1bmN0aW9uIHJldmVhbChncm91cCwgY291bnQsIGNiKSB7DQogICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCgnaW4nKTsNCiAgICBpZiAoY2IpIGNiKCk7DQogICAgaWYgKCFtb3Rpb24pIHsgZ3JvdXAuY2xhc3NMaXN0LmFkZCgnc2V0dGxlZCcpOyByZXR1cm47IH0NCiAgICB2YXIgd2FpdCA9IE1hdGgubWluKGNvdW50LCAzMCkgKiA0NSArIDcwMDsNCiAgICB2YXIgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTsNCiAgICAoZnVuY3Rpb24gdGljayhub3cpIHsgaWYgKG5vdyAtIHQwID49IHdhaXQpIGdyb3VwLmNsYXNzTGlzdC5hZGQoJ3NldHRsZWQnKTsgZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7IH0pKHQwKTsNCiAgfQ0KICBmdW5jdGlvbiBvYnNlcnZlKGl0ZW1zKSB7IC8vIGl0ZW1zOiBbW25vZGUsIGZuXV0NCiAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsNCiAgICAgIHZhciBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgew0KICAgICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICBpZiAoIWUuaXNJbnRlcnNlY3RpbmcpIHJldHVybjsNCiAgICAgICAgICBpby51bm9ic2VydmUoZS50YXJnZXQpOw0KICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7IGlmIChpdFswXSA9PT0gZS50YXJnZXQpIGl0WzFdKCk7IH0pOw0KICAgICAgICB9KTsNCiAgICAgIH0sIHsgdGhyZXNob2xkOiAwLjA1IH0pOw0KICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsgaW8ub2JzZXJ2ZShpdFswXSk7IH0pOw0KICAgIH0gZWxzZSB7DQogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyBpdFsxXSgpOyB9KTsNCiAgICB9DQogIH0NCiAgdmFyIGhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZCcpOw0KDQogIHZhciBEQVRBID0gew0KICAgIHByaW1hcnk6ICdNaWNyb3NvZnQtRGVjaXNpb24tMScsDQogICAgcm93czogWw0KICAgICAgLy8gbmFtZSwgc2NvcmUsIGtpbmQsIHN1YmxhYmVsLCBmb290bm90ZQ0KICAgICAgWydNaWNyb3NvZnQtRGVjaXNpb24tMScsIDgzLjUsICdwcmknLCAnJ10sDQogICAgICBbJ1F1eWV0LTEuMC1MYXJnZScsIDgxLjksICcnLCAnIzEgb24gSmV2QmVuY2gnXSwNCiAgICAgIFsnU3Vyb2dhdGUgUnVuZSAyNkItQTRCJywgNzkuNywgJycsICcjOCBvbiBKZXZCZW5jaCddLA0KICAgICAgWydHUFQtNiBMdW5hIERlY2lzaW9ucycsIDc5LjQsICcnLCAnIzcgb24gSmV2QmVuY2gnXSwNCiAgICAgIFsnZGVjay0zMUInLCA3Ny44LCAnJywgJyMzIG9uIEpldkJlbmNoJ10sDQogICAgICBbJ0gyTy1MaWdodG5pbmctNEInLCA3Ny4yLCAnJywgJyM1IG9uIEpldkJlbmNoJ10sDQogICAgICBbJ1N0cmFuZHMtRGVjaWRlciAyQicsIDU0LjgsICcnLCAnQVdTIMK3IDIzIG9mIDM2IGJlbmNobWFya3MqJywgdHJ1ZV0NCiAgICBdLA0KICAgIHRpY2tzOiBbWzAsICcwJSddLCBbMjUsICcyNSUnXSwgWzUwLCAnNTAlJ10sIFs3NSwgJzc1JSddLCBbMTAwLCAnMTAwJSddXQ0KICB9Ow0KDQogIHZhciByb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvd3MnKTsNCiAgdmFyIGdjZWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2djZWxsJyk7DQogIHZhciB0aWNrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aWNrcycpOw0KICB2YXIgY291bnRlcnMgPSBbXTsNCiAgZnVuY3Rpb24gZjEodikgeyByZXR1cm4gZm10Tih2LCAxKTsgfQ0KDQogIERBVEEucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyLCBpKSB7DQogICAgdmFyIHJvdyA9IGVsKCdkaXYnLCAncm93JyArIChyWzJdID8gJyAnICsgclsyXSA6ICcnKSk7DQogICAgcm93LnRhYkluZGV4ID0gMDsNCiAgICBzZXRWYXIocm93LCAnLS1pJywgU3RyaW5nKGkpKTsNCiAgICByb3cuZGF0YXNldC5pID0gU3RyaW5nKGkpOw0KICAgIHZhciBuYW1lID0gZWwoJ2RpdicsICduYW1lJywgclswXSk7DQogICAgaWYgKHJbM10pIG5hbWUuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAnc3VibCcsIHJbM10pKTsNCiAgICB2YXIgYXJlYSA9IGVsKCdkaXYnLCAnYXJlYScpOw0KICAgIHZhciB0cmFjayA9IGVsKCdkaXYnLCAndHJhY2snKTsNCiAgICB2YXIgZmlsbCA9IGVsKCdzcGFuJywgJ2ZpbGwnKTsNCiAgICBzZXRWYXIoZmlsbCwgJy0tdycsIHJbMV0gKyAnJScpOw0KICAgIHRyYWNrLmFwcGVuZENoaWxkKGZpbGwpOw0KICAgIHZhciB2YWwgPSBlbCgnc3BhbicsICd2YWwgbnVtJyk7DQogICAgc2V0VmFyKHZhbCwgJy0tdycsIHJbMV0gKyAnJScpOw0KICAgIHZhciBuID0gZWwoJ3NwYW4nLCBudWxsLCBmMShyWzFdKSk7DQogICAgdmFsLmFwcGVuZENoaWxkKG4pOw0KICAgIGlmIChyWzRdKSB2YWwuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCBudWxsLCAnKicpKTsNCiAgICBjb3VudGVycy5wdXNoKFtuLCByWzFdXSk7DQogICAgdHJhY2suYXBwZW5kQ2hpbGQodmFsKTsNCiAgICBhcmVhLmFwcGVuZENoaWxkKHRyYWNrKTsNCiAgICByb3cuYXBwZW5kQ2hpbGQobmFtZSk7DQogICAgcm93LmFwcGVuZENoaWxkKGFyZWEpOw0KICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCByWzBdICsgJzogJyArIGYxKHJbMV0pICsgJyUgYXZlcmFnZSBhY2N1cmFjeScgKyAoclszXSA/ICcgKCcgKyByWzNdICsgJyknIDogJycpKTsNCiAgICByb3dzLmFwcGVuZENoaWxkKHJvdyk7DQogIH0pOw0KICBEQVRBLnRpY2tzLmZvckVhY2goZnVuY3Rpb24gKHQpIHsNCiAgICB2YXIgZyA9IGVsKCdzcGFuJywgJ2dsJyk7IHNldFZhcihnLCAnLS1wJywgdFswXSArICclJyk7IGdjZWxsLmFwcGVuZENoaWxkKGcpOw0KICAgIHZhciBsID0gZWwoJ3NwYW4nLCBudWxsLCB0WzFdKTsgc2V0VmFyKGwsICctLXAnLCB0WzBdICsgJyUnKTsgdGlja3MuYXBwZW5kQ2hpbGQobCk7DQogIH0pOw0KDQogIGJpbmRUaXBzKCcucm93JywgZnVuY3Rpb24gKHJvdykgew0KICAgIHZhciByID0gREFUQS5yb3dzWytyb3cuZGF0YXNldC5pXTsNCiAgICB2YXIgYmFzZSA9IERBVEEucm93c1swXVsxXTsNCiAgICB2YXIgZCA9IHJbMV0gLSBiYXNlOw0KICAgIHZhciBzcGVjID0geyB0aXRsZTogclswXSwgcm93czogW1snQXZlcmFnZSBhY2N1cmFjeScsIGYxKHJbMV0pICsgJyUnLCByWzJdID09PSAncHJpJyA/ICdoaScgOiAnJ11dIH07DQogICAgaWYgKHJbMl0gIT09ICdwcmknKSBzcGVjLnJvd3MucHVzaChbJ3ZzICcgKyBEQVRBLnByaW1hcnksIChkID4gMCA/ICcrJyA6ICfiiJInKSArIGYxKE1hdGguYWJzKGQpKSArICcgcHRzJ10pOw0KICAgIGlmIChyWzNdKSBzcGVjLnJvd3MucHVzaChbcls0XSA/ICdDb3ZlcmFnZScgOiAnSmV2QmVuY2ggbGVhZGVyYm9hcmQnLCByWzNdLnJlcGxhY2UoJyonLCAnJykucmVwbGFjZSgnIG9uIEpldkJlbmNoJywgJycpXSk7DQogICAgc3BlYy5ub3RlID0gcls0XSA/ICdBdmVyYWdlZCBvdmVyIG9ubHkgdGhlIDIzIG9mIDM2IGJlbmNobWFya3MgdGhpcyBtb2RlbCBjb3VsZCBhbnN3ZXIuJw0KICAgICAgOiByWzJdID09PSAncHJpJyA/ICdNZWFuIGFjY3VyYWN5IGFjcm9zcyAzNiBiZW5jaG1hcmtzIGFuZCAxNDcsMTM3IHF1ZXN0aW9ucy4nDQogICAgICA6ICdTYW1lIDM2IGJlbmNobWFya3MsIDE0NywxMzcgcXVlc3Rpb25zLiBMZWFkZXJib2FyZCBwb3NpdGlvbiBhcyBvZiA4IE9jdG9iZXIgMjAyNi4nOw0KICAgIHJldHVybiBzcGVjOw0KICB9KTsNCg0KICB2YXIgY2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnQnKTsNCiAgb2JzZXJ2ZShbDQogICAgW2hlYWQsIGZ1bmN0aW9uICgpIHsgaGVhZC5jbGFzc0xpc3QuYWRkKCdpbicpOyB9XSwNCiAgICBbY2hhcnQsIGZ1bmN0aW9uICgpIHsNCiAgICAgIHJldmVhbChjaGFydCwgREFUQS5yb3dzLmxlbmd0aCwgZnVuY3Rpb24gKCkgew0KICAgICAgICBjb3VudGVycy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGNvdW50VXAoY1swXSwgY1sxXSwgZjEsIDgwMCwgMCk7IH0pOw0KICAgICAgfSk7DQogICAgfV0NCiAgXSk7DQoNCn0pKCk7DQo8L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4NCg==

3. Robustness

Equivalent inputs should produce equivalent decisions. In production, states and instructions get paraphrased, option descriptions change, choices are reordered, keys change, and harmless formatting noise appears. None of those changes should materially alter the decision.

We perturb the same request in eight ways and measure how often the decision flips. Microsoft-Decision-1 changes its decision on 1.3% of perturbations on average with zero flips when option descriptions are paraphrased or when options are reversed or shuffled.

4. Probability and confidence calibration

The probability itself is part of the API, not just a ranking score. Applications use confidence to decide when to act, defer, or ask for review, so a 90% prediction should be right about nine times out of 10 on representative cases.

PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIgY29udGVudD0iZGVmYXVsdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJyAndW5zYWZlLWV2YWwnOyBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnOyBpbWctc3JjIGRhdGE6IGJsb2I6IGh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3VwbG9hZHMvOyBmb250LXNyYyBkYXRhOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb207IG1lZGlhLXNyYyBkYXRhOiBibG9iOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC91cGxvYWRzLzsiPg0KPG1ldGEgY2hhcnNldD0idXRmLTgiPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4NCjx0aXRsZT5DYWxpYnJhdGlvbiBzY29yZTwvdGl0bGU+DQo8c3R5bGU+DQpAZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJQUCBOZXVlIE1vbnRyZWFsIjtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvUFBOZXVlTW9udHJlYWwtQm9vay5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjUwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1NZWRpdW0ub3RmIikgZm9ybWF0KCJvcGVudHlwZSIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJQUCBOZXVlIE1vbnRyZWFsIjtmb250LXdlaWdodDo3MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvUFBOZXVlTW9udHJlYWwtQm9sZC5vdGYiKSBmb3JtYXQoIm9wZW50eXBlIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IlBQIE5ldWUgTW9udHJlYWwiO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOml0YWxpYztmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9QUE5ldWVNb250cmVhbC1JdGFsaWMub3RmIikgZm9ybWF0KCJvcGVudHlwZSIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJDYXNjYWRpYSBDb2RlIjtmb250LXdlaWdodDoyMDAgNzAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL0Nhc2NhZGlhQ29kZS53b2ZmMiIpIGZvcm1hdCgid29mZjIiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiQ2FzY2FkaWEgQ29kZSI7Zm9udC13ZWlnaHQ6MjAwIDcwMDtmb250LXN0eWxlOml0YWxpYztmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9DYXNjYWRpYUNvZGVJdGFsaWMud29mZjIiKSBmb3JtYXQoIndvZmYyIik7fQ0KOnJvb3Qgew0KICAtLWJnOiAjZmZmOw0KICAtLWluazogIzAwMDsNCiAgLS1tdXRlZDogIzU1NTsNCiAgLS1mYWludDogI2M5YzljOTsgICAgICAgIC8qIHNlY29uZGFyeSBzZXJpZXMgKi8NCiAgLS1nb29kOiAjRTNGNjcxOyAgICAgICAgIC8qIHByaW1hcnkgbW9kZWwgKHNpdGUgYWNjZW50IGxpbWUpICovDQogIC0tYmFkOiAjRkZBMDM3OyAgICAgICAgICAvKiBwcmltYXJ5IG1vZGVsIGJlaGluZCAoc2l0ZSBhY2NlbnQgb3JhbmdlKSAqLw0KICAtLXJ1bGU6ICMwMDA7DQogIC0tcnVsZS1zb2Z0OiAjZTZlNmU2Ow0KICAtLWhvdmVyOiAjZjNmM2YzOw0KICAtLWJhZGdlLWJnOiAjMDAwOw0KICAtLWJhZGdlLWZnOiAjZmZmOw0KICAtLXRpcC1iZzogIzAwMDsNCiAgLS10aXAtZmc6ICNmZmY7DQogIC0tc2FuczogIlBQIE5ldWUgTW9udHJlYWwiLCBzYW5zLXNlcmlmOw0KICAtLW1vbm86ICJDYXNjYWRpYSBDb2RlIiwgdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsICJMaWJlcmF0aW9uIE1vbm8iLCBtb25vc3BhY2U7DQp9DQpodG1sW2RhdGEtdGhlbWU9ImRhcmsiXSB7DQogIC0tYmc6ICMxMTE7DQogIC0taW5rOiAjZmZmOw0KICAtLW11dGVkOiAjOTk5Ow0KICAtLWZhaW50OiAjNDQ0Ow0KICAtLXJ1bGU6ICNmZmY7DQogIC0tcnVsZS1zb2Z0OiAjMmEyYTJhOw0KICAtLWhvdmVyOiAjMWYxZjFmOw0KICAtLWJhZGdlLWJnOiAjZmZmOw0KICAtLWJhZGdlLWZnOiAjMTExOw0KICAtLXRpcC1iZzogI2ZmZjsNCiAgLS10aXAtZmc6ICMxMTE7DQp9DQoNCiogeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9DQpib2R5IHsNCiAgbWFyZ2luOiAwOw0KICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7DQogIGNvbG9yOiB2YXIoLS1pbmspOw0KICBmb250LWZhbWlseTogdmFyKC0tc2Fucyk7DQogIGZvbnQtc2l6ZTogMTVweDsNCiAgbGluZS1oZWlnaHQ6IDEuNDU7DQogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOw0KfQ0KLndyYXAgeyBwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmc6IDJweCAwIDZweDsgfQ0KLm51bSB7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsgfQ0KLmsgew0KICBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7DQogIGZvbnQtc2l6ZTogMTFweDsNCiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsNCiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCiAgY29sb3I6IHZhcigtLW11dGVkKTsNCn0NCmJ1dHRvbiB7IGZvbnQ6IGluaGVyaXQ7IGNvbG9yOiBpbmhlcml0OyBiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IDA7IHBhZGRpbmc6IDA7IGN1cnNvcjogcG9pbnRlcjsgfQ0KYnV0dG9uOmZvY3VzLXZpc2libGUsIFt0YWJpbmRleF06Zm9jdXMtdmlzaWJsZSB7IG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1pbmspOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9DQoNCi8qID09PT09PT09PT09PT09PT09IEhlYWRlciA9PT09PT09PT09PT09PT09PSAqLw0KLmhlYWQgeyBtYXJnaW4tYm90dG9tOiAyOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0NCi5iYWRnZSB7DQogIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgcGFkZGluZzogNHB4IDhweDsNCiAgYmFja2dyb3VuZDogdmFyKC0tYmFkZ2UtYmcpOw0KICBjb2xvcjogdmFyKC0tYmFkZ2UtZmcpOw0KICBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7DQogIGZvbnQtc2l6ZTogMTBweDsNCiAgbGluZS1oZWlnaHQ6IDE7DQogIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07DQogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7DQp9DQpoMSB7DQogIG1hcmdpbjogMThweCAwIDhweDsNCiAgZm9udC1zaXplOiBjbGFtcCgyNHB4LCA0LjJ2dywgMzJweCk7DQogIGZvbnQtd2VpZ2h0OiA1MDA7DQogIGxldHRlci1zcGFjaW5nOiAtMC4wMTVlbTsNCiAgbGluZS1oZWlnaHQ6IDEuMTI7DQp9DQouc3ViIHsgbWFyZ2luOiAwIGF1dG87IGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDEuNTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWF4LXdpZHRoOiA2MmNoOyB9DQouc3ViIC5kaXIgeyBjb2xvcjogdmFyKC0taW5rKTsgZm9udC13ZWlnaHQ6IDUwMDsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBMZWdlbmQgLyB0b2dnbGVzID09PT09PT09PT09PT09PT09ICovDQouY29udHJvbHMgew0KICBkaXNwbGF5OiBmbGV4Ow0KICBmbGV4LXdyYXA6IHdyYXA7DQogIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgZ2FwOiAxMHB4IDI0cHg7DQogIG1hcmdpbi1ib3R0b206IDE4cHg7DQp9DQoubGVnZW5kIHsgZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDRweCA2cHg7IH0NCi5sZWdlbmQgYnV0dG9uLCAudG9nZ2xlIGJ1dHRvbiB7DQogIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KICBnYXA6IDhweDsNCiAgcGFkZGluZzogNXB4IDExcHg7DQogIGZvbnQtc2l6ZTogMTNweDsNCiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnVsZS1zb2Z0KTsNCiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2UsIGJhY2tncm91bmQgMC4xNXMgZWFzZSwgb3BhY2l0eSAwLjJzIGVhc2U7DQp9DQoubGVnZW5kIGJ1dHRvbjpob3ZlciwgLnRvZ2dsZSBidXR0b246aG92ZXIgeyBib3JkZXItY29sb3I6IHZhcigtLWluayk7IH0NCi5sZWdlbmQgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNTAwOyB9DQoubGVnZW5kIC5zdyB7IHdpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7IGZsZXg6IDAgMCAxMHB4OyB9DQoubGVnZW5kIC5zdy5wcmkgeyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kKTsgfQ0KLmxlZ2VuZCAuc3cucmVmIHsgYmFja2dyb3VuZDogdmFyKC0taW5rKTsgfQ0KLmxlZ2VuZCAuc3cub3RoIHsgYmFja2dyb3VuZDogdmFyKC0tZmFpbnQpOyB9DQoubGVnZW5kLmlzbyBidXR0b246bm90KFthcmlhLXByZXNzZWQ9InRydWUiXSkgeyBvcGFjaXR5OiAwLjQ1OyB9DQoubGVnZW5kIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXTo6YWZ0ZXIgeyBjb250ZW50OiAiwrcgY2xpY2sgdG8gY2xlYXIiOyBmb250LXdlaWdodDogNDAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9DQoudG9nZ2xlIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA0cHg7IH0NCi50b2dnbGUgLmsgeyBtYXJnaW4tcmlnaHQ6IDhweDsgfQ0KLnRvZ2dsZSBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl0geyBiYWNrZ3JvdW5kOiB2YXIoLS1pbmspOyBjb2xvcjogdmFyKC0tYmcpOyBib3JkZXItY29sb3I6IHZhcigtLWluayk7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gTm90ZXMgLyBzb3VyY2UgPT09PT09PT09PT09PT09PT0gKi8NCi5ub3RlIHsgbWFyZ2luOiAxNnB4IDAgMDsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS41OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9DQoubm90ZSAubnVtIHsgY29sb3I6IHZhcigtLWluayk7IH0NCi5zb3VyY2UgeyBtYXJnaW4tdG9wOiAzMnB4OyBwYWRkaW5nLXRvcDogMTRweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXJ1bGUtc29mdCk7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuNTU7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IH0NCi5zb3VyY2UgcCB7IG1hcmdpbjogMCAwIDRweDsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBUb29sdGlwID09PT09PT09PT09PT09PT09ICovDQoudGlwIHsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICB6LWluZGV4OiAyOw0KICBtYXgtd2lkdGg6IDMwMHB4Ow0KICBwYWRkaW5nOiAxMHB4IDEycHg7DQogIGJhY2tncm91bmQ6IHZhcigtLXRpcC1iZyk7DQogIGNvbG9yOiB2YXIoLS10aXAtZmcpOw0KICBmb250LXNpemU6IDEzcHg7DQogIGxpbmUtaGVpZ2h0OiAxLjQ7DQogIHBvaW50ZXItZXZlbnRzOiBub25lOw0KICBvcGFjaXR5OiAwOw0KICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTJzIGVhc2U7DQp9DQoudGlwLnNob3cgeyBvcGFjaXR5OiAxOyB9DQoudGlwIC50IHsgZm9udC13ZWlnaHQ6IDUwMDsgbWFyZ2luLWJvdHRvbTogNnB4OyB9DQoudGlwIC5yIHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBnYXA6IDE2cHg7IH0NCi50aXAgLnIgKyAuciB7IG1hcmdpbi10b3A6IDJweDsgfQ0KLnRpcCAuci5oaSB7IGZvbnQtd2VpZ2h0OiA3MDA7IH0NCi50aXAgLnIuaGkgPiBzcGFuOmZpcnN0LWNoaWxkOjpiZWZvcmUgeyBjb250ZW50OiAiIjsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogOHB4OyBoZWlnaHQ6IDhweDsgbWFyZ2luLXJpZ2h0OiA4cHg7IHZlcnRpY2FsLWFsaWduOiAxcHg7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyB9DQoudGlwIC5yLmhpLmIgPiBzcGFuOmZpcnN0LWNoaWxkOjpiZWZvcmUgeyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQpOyB9DQoudGlwIC5zIHsgbWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nLXRvcDogNnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXRpcC1mZykgMjUlLCB0cmFuc3BhcmVudCk7IGZvbnQtc2l6ZTogMTJweDsgb3BhY2l0eTogMC44NTsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBNb3Rpb24gKHNoYXJlZCkgPT09PT09PT09PT09PT09PT0gKi8NCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSkgew0KICAuaGVhZCB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXMgZWFzZSwgdHJhbnNmb3JtIDAuNXMgZWFzZTsgfQ0KICAuaGVhZC5pbiB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogbm9uZTsgfQ0KfQ0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsNCiAgKiB7IHRyYW5zaXRpb246IG5vbmUgIWltcG9ydGFudDsgfQ0KfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7DQogIC5oZWFkIHsgbWFyZ2luLWJvdHRvbTogMjJweDsgfQ0KICAuc3ViIHsgZm9udC1zaXplOiAxNXB4OyB9DQogIC5sZWdlbmQgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdOjphZnRlciB7IGNvbnRlbnQ6ICLCtyB0YXAgdG8gY2xlYXIiOyB9DQp9DQoNCi8qID09PT09PT09PT09PT09PT09IEhvcml6b250YWwgYmFycyA9PT09PT09PT09PT09PT09PSAqLw0KLmhiYXIgeyAtLW5hbWUtdzogMjIwcHg7IC0tZ3V0dGVyOiA3MnB4OyAtLWdhcDogMTZweDsgfQ0KLnJvd3MgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH0NCi5ncmlkbGluZXMsIC5heGlzIHsNCiAgZGlzcGxheTogZ3JpZDsNCiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1uYW1lLXcpIG1pbm1heCgwLCAxZnIpOw0KICBnYXA6IDAgdmFyKC0tZ2FwKTsNCn0NCi5ncmlkbGluZXMgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGluc2V0OiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTsgfQ0KLmdjZWxsLCAudGlja3MgeyBncmlkLWNvbHVtbjogMjsgcG9zaXRpb246IHJlbGF0aXZlOyBtYXJnaW4tcmlnaHQ6IHZhcigtLWd1dHRlcik7IH0NCi5nbCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBib3R0b206IDA7IGxlZnQ6IHZhcigtLXApOyB3aWR0aDogMXB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1ydWxlLXNvZnQpOyB9DQouZ2w6Zmlyc3QtY2hpbGQgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ydWxlKTsgei1pbmRleDogMTsgfSAvKiBiYXNlbGluZSBzaXRzIGFib3ZlIHRoZSBmaWxscyBzbyBpdCByZWFkcyBhcyBvbmUgbGluZSAqLw0KLnJvdyB7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgZGlzcGxheTogZ3JpZDsNCiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1uYW1lLXcpIG1pbm1heCgwLCAxZnIpOw0KICBnYXA6IDAgdmFyKC0tZ2FwKTsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgcGFkZGluZzogNnB4IDA7DQogIGN1cnNvcjogcG9pbnRlcjsNCiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjEycyBlYXNlOw0KfQ0KLnJvdzpob3ZlciwgLnJvdzpmb2N1cy13aXRoaW4sIC5yb3cuaG90IHsgYmFja2dyb3VuZDogdmFyKC0taG92ZXIpOyB9DQoucm93OmhvdmVyIC5uYW1lLCAucm93LmhvdCAubmFtZSB7IGNvbG9yOiB2YXIoLS1pbmspOyB9DQoubmFtZSB7IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LXNpemU6IDE0LjVweDsgbGluZS1oZWlnaHQ6IDEuMzsgY29sb3I6IHZhcigtLW11dGVkKTsgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7IH0NCi5yb3cucHJpIC5uYW1lLCAucm93LnJlZiAubmFtZSB7IGNvbG9yOiB2YXIoLS1pbmspOyB9DQoucm93LnByaSAubmFtZSB7IGZvbnQtd2VpZ2h0OiA3MDA7IH0NCi5yb3cucmVmIC5uYW1lIHsgZm9udC13ZWlnaHQ6IDUwMDsgfQ0KLm5hbWUgLnN1YmwgeyBkaXNwbGF5OiBibG9jazsgbWFyZ2luLXRvcDogMnB4OyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTFweDsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLmFyZWEgeyBwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmctcmlnaHQ6IHZhcigtLWd1dHRlcik7IH0NCi50cmFjayB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgaGVpZ2h0OiAyMnB4OyB9DQouZmlsbCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiB2YXIoLS13KTsgYmFja2dyb3VuZDogdmFyKC0tZmFpbnQpOyB0cmFuc2l0aW9uOiB3aWR0aCAwLjVzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpOyB9DQoucm93LnByaSAuZmlsbCB7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyB9DQoucm93LnJlZiAuZmlsbCB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IH0NCi5yb3cucHJpIC5maWxsLnA5NSB7DQogIGxlZnQ6IHZhcigtLXcwKTsNCiAgd2lkdGg6IGNhbGModmFyKC0tdykgLSB2YXIoLS13MCkpOw0KICBiYWNrZ3JvdW5kOiByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tZ29vZCkgMCAzcHgsIHRyYW5zcGFyZW50IDNweCA2cHgpOw0KfQ0KLnZhbCB7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgbGVmdDogY2FsYyh2YXIoLS13KSArIDhweCk7DQogIHRvcDogNTAlOw0KICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7DQogIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogIGZvbnQtc2l6ZTogMTNweDsNCiAgY29sb3I6IHZhcigtLW11dGVkKTsNCiAgdHJhbnNpdGlvbjogbGVmdCAwLjVzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpOw0KfQ0KLnJvdy5wcmkgLnZhbCwgLnJvdy5yZWYgLnZhbCB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNzAwOyB9DQoudmFsIC5zZXAgeyBtYXJnaW46IDAgNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDogNDAwOyB9DQoudGlja3MgeyBoZWlnaHQ6IDIwcHg7IG1hcmdpbi10b3A6IDZweDsgfQ0KLnRpY2tzIHNwYW4geyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IHZhcigtLXApOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC1zaXplOiAxMXB4OyBsZXR0ZXItc3BhY2luZzogMC4wNGVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9DQoudGlja3Mgc3BhbjpmaXJzdC1jaGlsZCB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KDQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpIHsNCiAgLnJldmVhbCAuZmlsbCB7IHRyYW5zZm9ybTogc2NhbGVYKDApOyB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuNTVzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpLCB3aWR0aCAwLjVzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpOyB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWksIDApICogNDVtcyk7IH0NCiAgLnJldmVhbC5pbiAuZmlsbCB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICAucmV2ZWFsIC52YWwgeyBvcGFjaXR5OiAwOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNHMgZWFzZSwgbGVmdCAwLjVzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpOyB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWksIDApICogNDVtcyArIDI1MG1zKTsgfQ0KICAucmV2ZWFsLmluIC52YWwgeyBvcGFjaXR5OiAxOyB9DQogIC5yZXZlYWwgLnJvdyB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNnB4KTsgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjM1cyBlYXNlLCB0cmFuc2Zvcm0gMC4zNXMgZWFzZSwgYmFja2dyb3VuZCAwLjEycyBlYXNlOyB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWksIDApICogNDVtcyk7IH0NCiAgLnJldmVhbC5pbiAucm93IHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9DQogIC5yZXZlYWwuaW4uc2V0dGxlZCAuZmlsbCwgLnJldmVhbC5pbi5zZXR0bGVkIC52YWwsIC5yZXZlYWwuaW4uc2V0dGxlZCAucm93IHsgdHJhbnNpdGlvbi1kZWxheTogMHM7IH0NCiAgLnJldmVhbC5pbi5zZXR0bGVkIC5yb3cgeyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7IH0NCn0NCg0KQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KSB7IC5oYmFyIHsgLS1uYW1lLXc6IDE3MHB4OyB9IH0NCkBtZWRpYSAobWF4LXdpZHRoOiA3MDBweCkgeyAuaGJhciB7IC0tbmFtZS13OiAxNDBweDsgLS1nYXA6IDEycHg7IH0gLm5hbWUgeyBmb250LXNpemU6IDEzLjVweDsgfSAudmFsIHsgZm9udC1zaXplOiAxMnB4OyB9IH0NCkBtZWRpYSAobWF4LXdpZHRoOiA0ODBweCkgew0KICAuaGJhciB7IC0tbmFtZS13OiAxMDRweDsgLS1ndXR0ZXI6IDU2cHg7IC0tZ2FwOiAxMHB4OyB9DQogIC52YWwgLnByZSB7IGRpc3BsYXk6IG5vbmU7IH0NCiAgLm5hbWUgeyBmb250LXNpemU6IDEyLjVweDsgfQ0KICAubmFtZSAuc3VibCB7IGZvbnQtc2l6ZTogMTBweDsgfQ0KICAudmFsIHsgZm9udC1zaXplOiAxMXB4OyB9DQogIC52YWwgLnNlcCB7IG1hcmdpbjogMCA0cHg7IH0NCiAgLnRyYWNrIHsgaGVpZ2h0OiAxOHB4OyB9DQogIC50aWNrcyBzcGFuIHsgZm9udC1zaXplOiAxMHB4OyB9DQogIC50aWNrcyBzcGFuLmhpZGUtc20geyBkaXNwbGF5OiBub25lOyB9DQp9DQoNCi5oYmFyIHsgLS1ndXR0ZXI6IDY0cHg7IH0NCi5uYW1lIC5yayB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgbWluLXdpZHRoOiAxLjZlbTsgbWFyZ2luLXJpZ2h0OiA4cHg7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC1zaXplOiAxMnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiByaWdodDsgfQ0KLnRyYWNrIHsgaGVpZ2h0OiAyNHB4OyB9DQouc3RlbSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiA1MCU7IHdpZHRoOiB2YXIoLS13KTsgaGVpZ2h0OiAycHg7IG1hcmdpbi10b3A6IC0xcHg7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUtc29mdCk7IH0NCi5kb3QgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IHZhcigtLXcpOyB0b3A6IDUwJTsgd2lkdGg6IDE0cHg7IGhlaWdodDogMTRweDsgbWFyZ2luOiAtN3B4IDAgMCAtN3B4OyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IHZhcigtLWZhaW50KTsgfQ0KLnJvdy5wcmkgLmRvdCB7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0taW5rKTsgfQ0KLnJvdy5wcmkgLnN0ZW0geyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kKTsgfQ0KLnZhbCB7IGxlZnQ6IGNhbGModmFyKC0tdykgKyAxNHB4KTsgfQ0KLmdsLnBlcmZlY3QgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ydWxlKTsgfQ0KLnRpY2tzIHNwYW4ucGVyZmVjdCB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNzAwOyB9DQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpIHsNCiAgLnJldmVhbCAuc3RlbSB7IHRyYW5zZm9ybTogc2NhbGVYKDApOyB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuNTVzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpOyB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWksIDApICogNDVtcyk7IH0NCiAgLnJldmVhbC5pbiAuc3RlbSB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICAucmV2ZWFsIC5kb3QgeyB0cmFuc2Zvcm06IHNjYWxlKDApOyB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zNXMgY3ViaWMtYmV6aWVyKDAuMiwgMC44LCAwLjIsIDEuMyk7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0NW1zICsgMzgwbXMpOyB9DQogIC5yZXZlYWwuaW4gLmRvdCB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICAucmV2ZWFsLmluLnNldHRsZWQgLnN0ZW0sIC5yZXZlYWwuaW4uc2V0dGxlZCAuZG90IHsgdHJhbnNpdGlvbi1kZWxheTogMHM7IH0NCn0NCkBtZWRpYSAobWF4LXdpZHRoOiA0ODBweCkgeyAuaGJhciB7IC0tZ3V0dGVyOiA0OHB4OyAtLW5hbWUtdzogMTE4cHg7IH0gLm5hbWUgLnJrIHsgbWluLXdpZHRoOiAxLjJlbTsgbWFyZ2luLXJpZ2h0OiA1cHg7IGZvbnQtc2l6ZTogMTFweDsgfSB9DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQo8ZGl2IGNsYXNzPSJ3cmFwIiBpZD0icm9vdCI+DQogIDxoZWFkZXIgY2xhc3M9ImhlYWQiPg0KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSI+Q2FsaWJyYXRpb248L3NwYW4+DQogICAgPGgxPkNhbGlicmF0aW9uIHNjb3JlIG92ZXIgMzYgYmVuY2htYXJrczwvaDE+DQogICAgPHAgY2xhc3M9InN1YiI+PHNwYW4gY2xhc3M9ImRpciI+SGlnaGVyIGlzIGJldHRlci48L3NwYW4+IDEwMCBtZWFucyBhIG1vZGVs4oCZcyBjb25maWRlbmNlIGV4YWN0bHkgbWF0Y2hlcyBob3cgb2Z0ZW4gaXQgaXMgcmlnaHQuPC9wPg0KICA8L2hlYWRlcj4NCg0KICA8ZGl2IGNsYXNzPSJoYmFyIHJldmVhbCIgaWQ9ImNoYXJ0Ij4NCiAgICA8ZGl2IGNsYXNzPSJyb3dzIiBpZD0icm93cyI+DQogICAgICA8ZGl2IGNsYXNzPSJncmlkbGluZXMiIGFyaWEtaGlkZGVuPSJ0cnVlIj48ZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdjZWxsIiBpZD0iZ2NlbGwiPjwvZGl2PjwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgIDxkaXYgY2xhc3M9ImF4aXMiIGFyaWEtaGlkZGVuPSJ0cnVlIj48ZGl2PjwvZGl2PjxkaXYgY2xhc3M9InRpY2tzIiBpZD0idGlja3MiPjwvZGl2PjwvZGl2Pg0KICA8L2Rpdj4NCiAgPHAgY2xhc3M9Im5vdGUiPk1pY3Jvc29mdC1EZWNpc2lvbi0xIHJhbmtzIHNlY29uZCwgPHNwYW4gY2xhc3M9Im51bSI+MC45PC9zcGFuPiBiZWhpbmQgUXV5ZXQtMS4wLUxhcmdlIGFuZCBhaGVhZCBvZiB0aGUgb3RoZXIgZm91ciBtb2RlbHMgc2NvcmVkLiBUaGUgYXhpcyBzdGFydHMgYXQgODA6IGV2ZXJ5IG1vZGVsIGhlcmUgaXMgd2l0aGluIDE3IHBvaW50cyBvZiBwZXJmZWN0LjwvcD4NCiAgPGRpdiBjbGFzcz0ic291cmNlIj4NCiAgICA8cD5TYW1lIDM2IGJlbmNobWFya3MgYXMgdGhlIGFjY3VyYWN5IHJhbmtpbmcuPC9wPg0KICA8L2Rpdj4NCg0KICA8ZGl2IGNsYXNzPSJ0aXAiIGlkPSJ0aXAiIHJvbGU9InRvb2x0aXAiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L2Rpdj4NCjwvZGl2Pg0KPHNjcmlwdD4NCihmdW5jdGlvbiAoKSB7DQogIHZhciBtb3Rpb24gPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpJykubWF0Y2hlczsNCiAgdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9vdCcpOw0KICB2YXIgdGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpcCcpOw0KDQogIGZ1bmN0aW9uIGVsKHRhZywgY2xzLCB0ZXh0KSB7DQogICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7DQogICAgaWYgKGNscykgbi5jbGFzc05hbWUgPSBjbHM7DQogICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCAmJiB0ZXh0ICE9PSBudWxsKSBuLnRleHRDb250ZW50ID0gdGV4dDsNCiAgICByZXR1cm4gbjsNCiAgfQ0KICBmdW5jdGlvbiBzZXRWYXIobiwgaywgdikgeyBuLnN0eWxlLnNldFByb3BlcnR5KGssIHYpOyB9DQogIGZ1bmN0aW9uIGZtdE4obiwgZCkgeyByZXR1cm4gbi50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkIH0pOyB9DQoNCiAgLy8gLS0tLSBUb29sdGlwIChob3Zlciwga2V5Ym9hcmQgZm9jdXMgYW5kIHRhcCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIHZhciBob3QgPSBudWxsOw0KICBmdW5jdGlvbiByZW5kZXJUaXAoc3BlYykgew0KICAgIHRpcC5pbm5lckhUTUwgPSAnJzsNCiAgICBpZiAoc3BlYy50aXRsZSkgdGlwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCAndCcsIHNwZWMudGl0bGUpKTsNCiAgICAoc3BlYy5yb3dzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7DQogICAgICB2YXIgcm93ID0gZWwoJ2RpdicsICdyJyArIChyWzJdID8gJyAnICsgclsyXSA6ICcnKSk7DQogICAgICByb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCBudWxsLCByWzBdKSk7DQogICAgICByb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAnbnVtJywgclsxXSkpOw0KICAgICAgdGlwLmFwcGVuZENoaWxkKHJvdyk7DQogICAgfSk7DQogICAgaWYgKHNwZWMubm90ZSkgdGlwLmFwcGVuZENoaWxkKGVsKCdkaXYnLCAncycsIHNwZWMubm90ZSkpOw0KICB9DQogIGZ1bmN0aW9uIHBsYWNlVGlwKG5vZGUsIHByZWZlcikgew0KICAgIHZhciByciA9IHJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQogICAgdmFyIG5yID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICB2YXIgdHcgPSB0aXAub2Zmc2V0V2lkdGgsIHRoID0gdGlwLm9mZnNldEhlaWdodDsNCiAgICB2YXIgbGVmdCA9IG5yLmxlZnQgLSByci5sZWZ0ICsgKHByZWZlciA9PT0gJ2Fib3ZlJyA/IG5yLndpZHRoIC8gMiAtIHR3IC8gMiA6IDApOw0KICAgIGxlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZWZ0LCByci53aWR0aCAtIHR3KSk7DQogICAgdmFyIGJlbG93ID0gbnIuYm90dG9tIC0gcnIudG9wICsgNjsNCiAgICB2YXIgYWJvdmUgPSBuci50b3AgLSByci50b3AgLSB0aCAtIChwcmVmZXIgPT09ICdhYm92ZScgPyAyNiA6IDYpOw0KICAgIHZhciB0b3A7DQogICAgaWYgKHByZWZlciA9PT0gJ2Fib3ZlJykgdG9wID0gYWJvdmUgPj0gMCA/IGFib3ZlIDogTWF0aC5taW4oYmVsb3csIHJyLmhlaWdodCAtIHRoKTsNCiAgICBlbHNlIHRvcCA9IChiZWxvdyArIHRoIDw9IHJyLmhlaWdodCkgPyBiZWxvdyA6IE1hdGgubWF4KDAsIGFib3ZlKTsNCiAgICAvLyBTdGF5IGluc2lkZSB0aGUgd2lkZ2V0IHNvIHRoZSBhdXRvLXNpemVkIGZyYW1lIG5ldmVyIGNsaXBzIHRoZSB0aXAuDQogICAgdGlwLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JzsNCiAgICB0aXAuc3R5bGUudG9wID0gTWF0aC5tYXgoMCwgdG9wKSArICdweCc7DQogIH0NCiAgZnVuY3Rpb24gc2hvd1RpcChub2RlLCBidWlsZCwgcHJlZmVyKSB7DQogICAgaWYgKGhvdCA9PT0gbm9kZSkgcmV0dXJuOw0KICAgIGhpZGVUaXAoKTsNCiAgICBob3QgPSBub2RlOw0KICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnaG90Jyk7DQogICAgcmVuZGVyVGlwKGJ1aWxkKG5vZGUpKTsNCiAgICB0aXAuY2xhc3NMaXN0LmFkZCgnc2hvdycpOw0KICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7DQogICAgcGxhY2VUaXAobm9kZSwgcHJlZmVyKTsNCiAgfQ0KICBmdW5jdGlvbiBoaWRlVGlwKCkgew0KICAgIGlmIChob3QpIGhvdC5jbGFzc0xpc3QucmVtb3ZlKCdob3QnKTsNCiAgICBob3QgPSBudWxsOw0KICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7DQogICAgdGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOw0KICB9DQogIGZ1bmN0aW9uIGJpbmRUaXBzKHNlbGVjdG9yLCBidWlsZCwgcHJlZmVyKSB7DQogICAgZnVuY3Rpb24gZmluZCh0KSB7DQogICAgICB2YXIgbiA9IHQ7DQogICAgICB3aGlsZSAobiAmJiBuICE9PSByb290KSB7DQogICAgICAgIGlmIChuLm1hdGNoZXMgJiYgbi5tYXRjaGVzKHNlbGVjdG9yKSkgcmV0dXJuIG47DQogICAgICAgIG4gPSBuLnBhcmVudE5vZGU7DQogICAgICB9DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobikgc2hvd1RpcChuLCBidWlsZCwgcHJlZmVyKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuICYmICFuLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCkpIGhpZGVUaXAoKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSBmaW5kKGUudGFyZ2V0KTsgaWYgKG4pIHNob3dUaXAobiwgYnVpbGQsIHByZWZlcik7IH0pOw0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobiAmJiAhbi5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSBoaWRlVGlwKCk7IH0pOw0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7IGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGhpZGVUaXAoKTsgfSk7DQogIH0NCg0KICAvLyAtLS0tIENvdW50LXVwICh2aXNpYmlsaXR5LXRyaWdnZXJlZCB2aWEgcmV2ZWFsKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIHZhciBFQVNFID0gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gdCwgMyk7IH07DQogIGZ1bmN0aW9uIGNvdW50VXAobm9kZSwgdG8sIGZtdCwgbXMsIGRlbGF5KSB7DQogICAgaWYgKCFtb3Rpb24pIHsgbm9kZS50ZXh0Q29udGVudCA9IGZtdCh0byk7IHJldHVybjsgfQ0KICAgIHZhciBzdGFydCA9IG51bGw7DQogICAgbm9kZS50ZXh0Q29udGVudCA9IGZtdCgwKTsNCiAgICBmdW5jdGlvbiBmcmFtZShub3cpIHsNCiAgICAgIGlmIChzdGFydCA9PT0gbnVsbCkgc3RhcnQgPSBub3cgKyAoZGVsYXkgfHwgMCk7DQogICAgICB2YXIgdCA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIChub3cgLSBzdGFydCkgLyBtcykpOw0KICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGZtdCh0byAqIEVBU0UodCkpOw0KICAgICAgaWYgKHQgPCAxKSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOw0KICAgIH0NCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnJhbWUpOw0KICB9DQoNCiAgLy8gLS0tLSBSZXZlYWwgKEludGVyc2VjdGlvbk9ic2VydmVyIG9ubHk7IG5vIHRpbWVycyBzdGFydCBhbnl0aGluZykgLS0tLS0tDQogIC8vIGBzZXR0bGVkYCByZW1vdmVzIHN0YWdnZXIgZGVsYXlzIG9uY2UgdGhlIGVudHJhbmNlIGhhcyBwbGF5ZWQgc28gaG92ZXIsDQogIC8vIHRvZ2dsZXMgYW5kIGZpbHRlcnMgcmVzcG9uZCBpbW1lZGlhdGVseSBhZnRlcndhcmRzLg0KICBmdW5jdGlvbiByZXZlYWwoZ3JvdXAsIGNvdW50LCBjYikgew0KICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQoJ2luJyk7DQogICAgaWYgKGNiKSBjYigpOw0KICAgIGlmICghbW90aW9uKSB7IGdyb3VwLmNsYXNzTGlzdC5hZGQoJ3NldHRsZWQnKTsgcmV0dXJuOyB9DQogICAgdmFyIHdhaXQgPSBNYXRoLm1pbihjb3VudCwgMzApICogNDUgKyA3MDA7DQogICAgdmFyIHQwID0gcGVyZm9ybWFuY2Uubm93KCk7DQogICAgKGZ1bmN0aW9uIHRpY2sobm93KSB7IGlmIChub3cgLSB0MCA+PSB3YWl0KSBncm91cC5jbGFzc0xpc3QuYWRkKCdzZXR0bGVkJyk7IGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spOyB9KSh0MCk7DQogIH0NCiAgZnVuY3Rpb24gb2JzZXJ2ZShpdGVtcykgeyAvLyBpdGVtczogW1tub2RlLCBmbl1dDQogICAgaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93KSB7DQogICAgICB2YXIgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHsNCiAgICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgaWYgKCFlLmlzSW50ZXJzZWN0aW5nKSByZXR1cm47DQogICAgICAgICAgaW8udW5vYnNlcnZlKGUudGFyZ2V0KTsNCiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyBpZiAoaXRbMF0gPT09IGUudGFyZ2V0KSBpdFsxXSgpOyB9KTsNCiAgICAgICAgfSk7DQogICAgICB9LCB7IHRocmVzaG9sZDogMC4wNSB9KTsNCiAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7IGlvLm9ic2VydmUoaXRbMF0pOyB9KTsNCiAgICB9IGVsc2Ugew0KICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsgaXRbMV0oKTsgfSk7DQogICAgfQ0KICB9DQogIHZhciBoZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWQnKTsNCg0KICB2YXIgREFUQSA9IHsNCiAgICBwcmltYXJ5OiAnTWljcm9zb2Z0LURlY2lzaW9uLTEnLA0KICAgIHJvd3M6IFsNCiAgICAgIC8vIHJhbmssIG5hbWUsIHNjb3JlLCBraW5kDQogICAgICBbMSwgJ1F1eWV0LTEuMC1MYXJnZScsIDkzLjEsICcnXSwNCiAgICAgIFsyLCAnTWljcm9zb2Z0LURlY2lzaW9uLTEnLCA5Mi4yLCAncHJpJ10sDQogICAgICBbMywgJ1N1cm9nYXRlIFJ1bmUgMjZCLUE0QicsIDkxLjgsICcnXSwNCiAgICAgIFs0LCAnSDJPLUxpZ2h0bmluZy00QicsIDkxLjgsICcnXSwNCiAgICAgIFs1LCAnR1BULTYgTHVuYSBEZWNpc2lvbnMnLCA4OS45LCAnJ10sDQogICAgICBbNiwgJ2RlY2stMzFCJywgODMuNSwgJyddDQogICAgXSwNCiAgICBtaW46IDgwLCBtYXg6IDEwMCwNCiAgICB0aWNrczogW1s4MCwgJzgwJ10sIFs4NSwgJzg1JywgMV0sIFs5MCwgJzkwJ10sIFs5NSwgJzk1JywgMV0sIFsxMDAsICcxMDAgwrcgcGVyZmVjdCddXQ0KICB9Ow0KICBmdW5jdGlvbiBwY3QodikgeyByZXR1cm4gKHYgLSBEQVRBLm1pbikgLyAoREFUQS5tYXggLSBEQVRBLm1pbikgKiAxMDA7IH0NCiAgZnVuY3Rpb24gZjEodikgeyByZXR1cm4gZm10Tih2LCAxKTsgfQ0KDQogIHZhciByb3dzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvd3MnKTsNCiAgdmFyIGdjZWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2djZWxsJyk7DQogIHZhciB0aWNrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aWNrcycpOw0KICB2YXIgY291bnRlcnMgPSBbXTsNCg0KICBEQVRBLnJvd3MuZm9yRWFjaChmdW5jdGlvbiAociwgaSkgew0KICAgIHZhciByb3cgPSBlbCgnZGl2JywgJ3JvdycgKyAoclszXSA/ICcgJyArIHJbM10gOiAnJykpOyByb3cudGFiSW5kZXggPSAwOw0KICAgIHNldFZhcihyb3csICctLWknLCBTdHJpbmcoaSkpOyByb3cuZGF0YXNldC5pID0gU3RyaW5nKGkpOw0KICAgIHZhciBuYW1lID0gZWwoJ2RpdicsICduYW1lJyk7IG5hbWUuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAncmsnLCBTdHJpbmcoclswXSkpKTsgbmFtZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShyWzFdKSk7DQogICAgdmFyIGFyZWEgPSBlbCgnZGl2JywgJ2FyZWEnKTsNCiAgICB2YXIgdHJhY2sgPSBlbCgnZGl2JywgJ3RyYWNrJyk7DQogICAgdmFyIHN0ZW0gPSBlbCgnc3BhbicsICdzdGVtJyk7IHNldFZhcihzdGVtLCAnLS13JywgcGN0KHJbMl0pICsgJyUnKTsgdHJhY2suYXBwZW5kQ2hpbGQoc3RlbSk7DQogICAgdmFyIGRvdCA9IGVsKCdzcGFuJywgJ2RvdCcpOyBzZXRWYXIoZG90LCAnLS13JywgcGN0KHJbMl0pICsgJyUnKTsgdHJhY2suYXBwZW5kQ2hpbGQoZG90KTsNCiAgICB2YXIgdmFsID0gZWwoJ3NwYW4nLCAndmFsIG51bScsIGYxKHJbMl0pKTsgc2V0VmFyKHZhbCwgJy0tdycsIHBjdChyWzJdKSArICclJyk7IGNvdW50ZXJzLnB1c2goW3ZhbCwgclsyXV0pOyB0cmFjay5hcHBlbmRDaGlsZCh2YWwpOw0KICAgIGFyZWEuYXBwZW5kQ2hpbGQodHJhY2spOyByb3cuYXBwZW5kQ2hpbGQobmFtZSk7IHJvdy5hcHBlbmRDaGlsZChhcmVhKTsNCiAgICByb3cuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1JhbmsgJyArIHJbMF0gKyAnLCAnICsgclsxXSArICc6IGNhbGlicmF0aW9uIHNjb3JlICcgKyBmMShyWzJdKSk7DQogICAgcm93cy5hcHBlbmRDaGlsZChyb3cpOw0KICB9KTsNCiAgREFUQS50aWNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7DQogICAgdmFyIGcgPSBlbCgnc3BhbicsICdnbCcgKyAodFswXSA9PT0gREFUQS5tYXggPyAnIHBlcmZlY3QnIDogJycpKTsgc2V0VmFyKGcsICctLXAnLCBwY3QodFswXSkgKyAnJScpOyBnY2VsbC5hcHBlbmRDaGlsZChnKTsNCiAgICB2YXIgbCA9IGVsKCdzcGFuJywgKHRbMF0gPT09IERBVEEubWF4ID8gJ3BlcmZlY3QnIDogJycpICsgKHRbMl0gPyAnIGhpZGUtc20nIDogJycpLCB0WzFdKTsgc2V0VmFyKGwsICctLXAnLCBwY3QodFswXSkgKyAnJScpOyB0aWNrcy5hcHBlbmRDaGlsZChsKTsNCiAgfSk7DQoNCiAgYmluZFRpcHMoJy5yb3cnLCBmdW5jdGlvbiAocm93KSB7DQogICAgdmFyIHIgPSBEQVRBLnJvd3NbK3Jvdy5kYXRhc2V0LmldOw0KICAgIHZhciB0b3AgPSBEQVRBLnJvd3NbMF07DQogICAgdmFyIG1lID0gREFUQS5yb3dzWzFdOw0KICAgIHZhciBzcGVjID0geyB0aXRsZTogclsxXSwgcm93czogW1snQ2FsaWJyYXRpb24gc2NvcmUnLCBmMShyWzJdKSwgclszXSA9PT0gJ3ByaScgPyAnaGknIDogJyddLCBbJ1JhbmsnLCByWzBdICsgJyBvZiAnICsgREFUQS5yb3dzLmxlbmd0aF1dIH07DQogICAgaWYgKHJbM10gIT09ICdwcmknKSB7IHZhciBkID0gclsyXSAtIG1lWzJdOyBzcGVjLnJvd3MucHVzaChbJ3ZzICcgKyBEQVRBLnByaW1hcnksIChkID49IDAgPyAnKycgOiAn4oiSJykgKyBmMShNYXRoLmFicyhkKSkgKyAnIHB0cyddKTsgfQ0KICAgIHNwZWMubm90ZSA9IHJbM10gPT09ICdwcmknID8gZjEodG9wWzJdIC0gbWVbMl0pICsgJyBiZWhpbmQgJyArIHRvcFsxXSArICcsIGFoZWFkIG9mIHRoZSBvdGhlciBmb3VyLiAxMDAgd291bGQgbWVhbiBpdHMgY29uZmlkZW5jZSBleGFjdGx5IG1hdGNoZXMgaG93IG9mdGVuIGl0IGlzIHJpZ2h0LicNCiAgICAgIDogJzEwMCBtZWFucyBhIG1vZGVs4oCZcyBjb25maWRlbmNlIGV4YWN0bHkgbWF0Y2hlcyBob3cgb2Z0ZW4gaXQgaXMgcmlnaHQuJzsNCiAgICByZXR1cm4gc3BlYzsNCiAgfSk7DQoNCiAgdmFyIGNoYXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0Jyk7DQogIG9ic2VydmUoWw0KICAgIFtoZWFkLCBmdW5jdGlvbiAoKSB7IGhlYWQuY2xhc3NMaXN0LmFkZCgnaW4nKTsgfV0sDQogICAgW2NoYXJ0LCBmdW5jdGlvbiAoKSB7IHJldmVhbChjaGFydCwgREFUQS5yb3dzLmxlbmd0aCwgZnVuY3Rpb24gKCkgeyBjb3VudGVycy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGNvdW50VXAoY1swXSwgY1sxXSwgZjEsIDgwMCwgMCk7IH0pOyB9KTsgfV0NCiAgXSk7DQoNCn0pKCk7DQo8L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4NCg==

5. Safety

A decision model should recognize harmful requests without needlessly blocking harmless ones. We tested Microsoft-Decision-1 on 5,250 requests across 11 benchmarks, covering harmful content, jailbreak attempts, and prompt injection, and found that the model successfully refused harmful behavior while retaining a high degree of utility.

Demo examples

Classification is a key use case for decision models. Check out how accurately and quickly Microsoft-Decision-1 can categorize a variety of queries compared to GPT-6 Sol:

Video 1

Decision models can also be efficient for computer use scenarios. This demo shows how fast Microsoft-Decision-1 can complete the task of buying a backpack compared to GPT-6 Sol:

Video 2

How we’re testing Microsoft-Decision-1 internally

Here are some of the ways we’ve been testing Microsoft-Decision-1 internally, with a lot more to come.

Labeling data

XBOX Research used Microsoft-Decision-1 to process more than 10,000 open-ended pieces of feedback and reviews from surveys, STEAM, and Twitter/X and sort them into a fixed set of themes established by researchers to understand what people are saying about different games, launches, streams, and more. They found Microsoft-Decision-1 to be competitive on quality with GPT-6 Sol while running over 14 times faster and 200 times less expensive.

PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIgY29udGVudD0iZGVmYXVsdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJyAndW5zYWZlLWV2YWwnOyBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnOyBpbWctc3JjIGRhdGE6IGJsb2I6IGh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3VwbG9hZHMvOyBmb250LXNyYyBkYXRhOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb207IG1lZGlhLXNyYyBkYXRhOiBibG9iOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC91cGxvYWRzLzsiPg0KPG1ldGEgY2hhcnNldD0idXRmLTgiPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4NCjx0aXRsZT5TcGVlZCBwZXIgY2xhc3NpZmljYXRpb248L3RpdGxlPg0KPHN0eWxlPg0KQGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLUJvb2sub3RmIikgZm9ybWF0KCJvcGVudHlwZSIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJQUCBOZXVlIE1vbnRyZWFsIjtmb250LXdlaWdodDo1MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvUFBOZXVlTW9udHJlYWwtTWVkaXVtLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLUJvbGQub3RmIikgZm9ybWF0KCJvcGVudHlwZSIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJQUCBOZXVlIE1vbnRyZWFsIjtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvUFBOZXVlTW9udHJlYWwtSXRhbGljLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiQ2FzY2FkaWEgQ29kZSI7Zm9udC13ZWlnaHQ6MjAwIDcwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9DYXNjYWRpYUNvZGUud29mZjIiKSBmb3JtYXQoIndvZmYyIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IkNhc2NhZGlhIENvZGUiO2ZvbnQtd2VpZ2h0OjIwMCA3MDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvQ2FzY2FkaWFDb2RlSXRhbGljLndvZmYyIikgZm9ybWF0KCJ3b2ZmMiIpO30NCjpyb290IHsNCiAgLS1iZzogI2ZmZjsNCiAgLS1pbms6ICMwMDA7DQogIC0tbXV0ZWQ6ICM1NTU7DQogIC0tZmFpbnQ6ICNjOWM5Yzk7ICAgICAgICAvKiBzZWNvbmRhcnkgc2VyaWVzICovDQogIC0tZ29vZDogI0UzRjY3MTsgICAgICAgICAvKiBwcmltYXJ5IG1vZGVsIChzaXRlIGFjY2VudCBsaW1lKSAqLw0KICAtLWJhZDogI0ZGQTAzNzsgICAgICAgICAgLyogcHJpbWFyeSBtb2RlbCBiZWhpbmQgKHNpdGUgYWNjZW50IG9yYW5nZSkgKi8NCiAgLS1ydWxlOiAjMDAwOw0KICAtLXJ1bGUtc29mdDogI2U2ZTZlNjsNCiAgLS1ob3ZlcjogI2YzZjNmMzsNCiAgLS1iYWRnZS1iZzogIzAwMDsNCiAgLS1iYWRnZS1mZzogI2ZmZjsNCiAgLS10aXAtYmc6ICMwMDA7DQogIC0tdGlwLWZnOiAjZmZmOw0KICAtLXNhbnM6ICJQUCBOZXVlIE1vbnRyZWFsIiwgc2Fucy1zZXJpZjsNCiAgLS1tb25vOiAiQ2FzY2FkaWEgQ29kZSIsIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAiTGliZXJhdGlvbiBNb25vIiwgbW9ub3NwYWNlOw0KfQ0KaHRtbFtkYXRhLXRoZW1lPSJkYXJrIl0gew0KICAtLWJnOiAjMTExOw0KICAtLWluazogI2ZmZjsNCiAgLS1tdXRlZDogIzk5OTsNCiAgLS1mYWludDogIzQ0NDsNCiAgLS1ydWxlOiAjZmZmOw0KICAtLXJ1bGUtc29mdDogIzJhMmEyYTsNCiAgLS1ob3ZlcjogIzFmMWYxZjsNCiAgLS1iYWRnZS1iZzogI2ZmZjsNCiAgLS1iYWRnZS1mZzogIzExMTsNCiAgLS10aXAtYmc6ICNmZmY7DQogIC0tdGlwLWZnOiAjMTExOw0KfQ0KDQoqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQ0KYm9keSB7DQogIG1hcmdpbjogMDsNCiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOw0KICBjb2xvcjogdmFyKC0taW5rKTsNCiAgZm9udC1mYW1pbHk6IHZhcigtLXNhbnMpOw0KICBmb250LXNpemU6IDE1cHg7DQogIGxpbmUtaGVpZ2h0OiAxLjQ1Ow0KICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsNCn0NCi53cmFwIHsgcG9zaXRpb246IHJlbGF0aXZlOyBwYWRkaW5nOiAycHggMCA2cHg7IH0NCi5udW0geyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7IH0NCi5rIHsNCiAgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOw0KICBmb250LXNpemU6IDExcHg7DQogIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07DQogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7DQogIGNvbG9yOiB2YXIoLS1tdXRlZCk7DQp9DQpidXR0b24geyBmb250OiBpbmhlcml0OyBjb2xvcjogaW5oZXJpdDsgYmFja2dyb3VuZDogbm9uZTsgYm9yZGVyOiAwOyBwYWRkaW5nOiAwOyBjdXJzb3I6IHBvaW50ZXI7IH0NCmJ1dHRvbjpmb2N1cy12aXNpYmxlLCBbdGFiaW5kZXhdOmZvY3VzLXZpc2libGUgeyBvdXRsaW5lOiAycHggc29saWQgdmFyKC0taW5rKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBIZWFkZXIgPT09PT09PT09PT09PT09PT0gKi8NCi5oZWFkIHsgbWFyZ2luLWJvdHRvbTogMjhweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9DQouYmFkZ2Ugew0KICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogIHBhZGRpbmc6IDRweCA4cHg7DQogIGJhY2tncm91bmQ6IHZhcigtLWJhZGdlLWJnKTsNCiAgY29sb3I6IHZhcigtLWJhZGdlLWZnKTsNCiAgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOw0KICBmb250LXNpemU6IDEwcHg7DQogIGxpbmUtaGVpZ2h0OiAxOw0KICBsZXR0ZXItc3BhY2luZzogMC4wNmVtOw0KICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOw0KfQ0KaDEgew0KICBtYXJnaW46IDE4cHggMCA4cHg7DQogIGZvbnQtc2l6ZTogY2xhbXAoMjRweCwgNC4ydncsIDMycHgpOw0KICBmb250LXdlaWdodDogNTAwOw0KICBsZXR0ZXItc3BhY2luZzogLTAuMDE1ZW07DQogIGxpbmUtaGVpZ2h0OiAxLjEyOw0KfQ0KLnN1YiB7IG1hcmdpbjogMCBhdXRvOyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxLjU7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1heC13aWR0aDogNjJjaDsgfQ0KLnN1YiAuZGlyIHsgY29sb3I6IHZhcigtLWluayk7IGZvbnQtd2VpZ2h0OiA1MDA7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gTGVnZW5kIC8gdG9nZ2xlcyA9PT09PT09PT09PT09PT09PSAqLw0KLmNvbnRyb2xzIHsNCiAgZGlzcGxheTogZmxleDsNCiAgZmxleC13cmFwOiB3cmFwOw0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogIGdhcDogMTBweCAyNHB4Ow0KICBtYXJnaW4tYm90dG9tOiAxOHB4Ow0KfQ0KLmxlZ2VuZCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA0cHggNnB4OyB9DQoubGVnZW5kIGJ1dHRvbiwgLnRvZ2dsZSBidXR0b24gew0KICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgZ2FwOiA4cHg7DQogIHBhZGRpbmc6IDVweCAxMXB4Ow0KICBmb250LXNpemU6IDEzcHg7DQogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJ1bGUtc29mdCk7DQogIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cyBlYXNlLCBiYWNrZ3JvdW5kIDAuMTVzIGVhc2UsIG9wYWNpdHkgMC4ycyBlYXNlOw0KfQ0KLmxlZ2VuZCBidXR0b246aG92ZXIsIC50b2dnbGUgYnV0dG9uOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbmspOyB9DQoubGVnZW5kIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXSB7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgZm9udC13ZWlnaHQ6IDUwMDsgfQ0KLmxlZ2VuZCAuc3cgeyB3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4OyBmbGV4OiAwIDAgMTBweDsgfQ0KLmxlZ2VuZCAuc3cucHJpIHsgYmFja2dyb3VuZDogdmFyKC0tZ29vZCk7IH0NCi5sZWdlbmQgLnN3LnJlZiB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IH0NCi5sZWdlbmQgLnN3Lm90aCB7IGJhY2tncm91bmQ6IHZhcigtLWZhaW50KTsgfQ0KLmxlZ2VuZC5pc28gYnV0dG9uOm5vdChbYXJpYS1wcmVzc2VkPSJ0cnVlIl0pIHsgb3BhY2l0eTogMC40NTsgfQ0KLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl06OmFmdGVyIHsgY29udGVudDogIsK3IGNsaWNrIHRvIGNsZWFyIjsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLnRvZ2dsZSB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyB9DQoudG9nZ2xlIC5rIHsgbWFyZ2luLXJpZ2h0OiA4cHg7IH0NCi50b2dnbGUgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIHsgYmFja2dyb3VuZDogdmFyKC0taW5rKTsgY29sb3I6IHZhcigtLWJnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbmspOyB9DQoNCi8qID09PT09PT09PT09PT09PT09IE5vdGVzIC8gc291cmNlID09PT09PT09PT09PT09PT09ICovDQoubm90ZSB7IG1hcmdpbjogMTZweCAwIDA7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuNTsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLm5vdGUgLm51bSB7IGNvbG9yOiB2YXIoLS1pbmspOyB9DQouc291cmNlIHsgbWFyZ2luLXRvcDogMzJweDsgcGFkZGluZy10b3A6IDE0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ydWxlLXNvZnQpOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjU1OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9DQouc291cmNlIHAgeyBtYXJnaW46IDAgMCA0cHg7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gVG9vbHRpcCA9PT09PT09PT09PT09PT09PSAqLw0KLnRpcCB7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgei1pbmRleDogMjsNCiAgbWF4LXdpZHRoOiAzMDBweDsNCiAgcGFkZGluZzogMTBweCAxMnB4Ow0KICBiYWNrZ3JvdW5kOiB2YXIoLS10aXAtYmcpOw0KICBjb2xvcjogdmFyKC0tdGlwLWZnKTsNCiAgZm9udC1zaXplOiAxM3B4Ow0KICBsaW5lLWhlaWdodDogMS40Ow0KICBwb2ludGVyLWV2ZW50czogbm9uZTsNCiAgb3BhY2l0eTogMDsNCiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjEycyBlYXNlOw0KfQ0KLnRpcC5zaG93IHsgb3BhY2l0eTogMTsgfQ0KLnRpcCAudCB7IGZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDZweDsgfQ0KLnRpcCAuciB7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiAxNnB4OyB9DQoudGlwIC5yICsgLnIgeyBtYXJnaW4tdG9wOiAycHg7IH0NCi50aXAgLnIuaGkgeyBmb250LXdlaWdodDogNzAwOyB9DQoudGlwIC5yLmhpID4gc3BhbjpmaXJzdC1jaGlsZDo6YmVmb3JlIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDhweDsgaGVpZ2h0OiA4cHg7IG1hcmdpbi1yaWdodDogOHB4OyB2ZXJ0aWNhbC1hbGlnbjogMXB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kKTsgfQ0KLnRpcCAuci5oaS5iID4gc3BhbjpmaXJzdC1jaGlsZDo6YmVmb3JlIHsgYmFja2dyb3VuZDogdmFyKC0tYmFkKTsgfQ0KLnRpcCAucyB7IG1hcmdpbi10b3A6IDhweDsgcGFkZGluZy10b3A6IDZweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS10aXAtZmcpIDI1JSwgdHJhbnNwYXJlbnQpOyBmb250LXNpemU6IDEycHg7IG9wYWNpdHk6IDAuODU7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gTW90aW9uIChzaGFyZWQpID09PT09PT09PT09PT09PT09ICovDQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpIHsNCiAgLmhlYWQgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzIGVhc2UsIHRyYW5zZm9ybSAwLjVzIGVhc2U7IH0NCiAgLmhlYWQuaW4geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7IH0NCn0NCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7DQogICogeyB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7IH0NCn0NCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgew0KICAuaGVhZCB7IG1hcmdpbi1ib3R0b206IDIycHg7IH0NCiAgLnN1YiB7IGZvbnQtc2l6ZTogMTVweDsgfQ0KICAubGVnZW5kIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXTo6YWZ0ZXIgeyBjb250ZW50OiAiwrcgdGFwIHRvIGNsZWFyIjsgfQ0KfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBWZXJ0aWNhbCBncm91cGVkIGJhcnMgPT09PT09PT09PT09PT09PT0gKi8NCi5wYW5lbHMgeyBkaXNwbGF5OiBncmlkOyBnYXA6IDI4cHggMzJweDsgfQ0KLnBhbmVsIHsgbWluLXdpZHRoOiAwOyB9DQoucHRpdGxlIHsgbWFyZ2luOiAwIDAgMTRweDsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNTAwOyBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsgfQ0KLnB0aXRsZSAucG0geyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWxlZnQ6IDhweDsgfQ0KLnBsb3QsIC54bGFiZWxzIHsgLS15dzogNDRweDsgfQ0KLnBsb3QgeyAtLWg6IDI4MHB4OyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLXl3KSBtaW5tYXgoMCwgMWZyKTsgfQ0KLmFyZWEgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGhlaWdodDogdmFyKC0taCk7IGdyaWQtY29sdW1uOiAyOyB9DQoueWxpbmVzIHsgcG9zaXRpb246IGFic29sdXRlOyBpbnNldDogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0NCi55bCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogdmFyKC0tcCk7IGhlaWdodDogMXB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1ydWxlLXNvZnQpOyB9DQoueWwuYmFzZSB7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUpOyB6LWluZGV4OiAxOyB9DQoueWwgaSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IGNhbGMoMTAwJSArIDhweCk7IHRvcDogNTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXNpemU6IDExcHg7IGxldHRlci1zcGFjaW5nOiAwLjA0ZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCi5ncm91cHMgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGluc2V0OiAwOyBkaXNwbGF5OiBmbGV4OyB9DQouYmFycyB7IGRpc3BsYXk6IGNvbnRlbnRzOyB9DQouZ3JvdXAgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGZsZXg6IDEgMSAwOyBtaW4td2lkdGg6IDA7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogNHB4OyBwYWRkaW5nOiAwIDUlOyB9DQouYW5ubyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgbGluZS1oZWlnaHQ6IDEuMzsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfQ0KLmFubm8gc21hbGwgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAxMHB4OyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogMC4wNGVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9DQouYmFyIHsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICBmbGV4OiAwIDEgdmFyKC0tYncsIDQ0cHgpOw0KICBtaW4td2lkdGg6IDEwcHg7DQogIGhlaWdodDogdmFyKC0tdik7DQogIGJhY2tncm91bmQ6IHZhcigtLWZhaW50KTsNCiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7DQp9DQouYmFyLnByaSB7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyB9DQouYmFyLnJlZiB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IH0NCi5iYXI6aG92ZXIsIC5iYXIuaG90IHsgZmlsdGVyOiBicmlnaHRuZXNzKDAuOTIpOyB9DQpodG1sW2RhdGEtdGhlbWU9ImRhcmsiXSAuYmFyOmhvdmVyLCBodG1sW2RhdGEtdGhlbWU9ImRhcmsiXSAuYmFyLmhvdCB7IGZpbHRlcjogYnJpZ2h0bmVzcygxLjI1KTsgfQ0KLmJhciAubGFiIHsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBib3R0b206IDEwMCU7DQogIGxlZnQ6IDUwJTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOw0KICBtYXJnaW4tYm90dG9tOiA1cHg7DQogIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsNCiAgZm9udC1zaXplOiAxMnB4Ow0KICBjb2xvcjogdmFyKC0tbXV0ZWQpOw0KfQ0KLmJhci5wcmkgLmxhYiwgLmJhci5yZWYgLmxhYiB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNzAwOyB9DQoucGxvdC5pc28gLmJhcjpub3QoLm9uKSB7IG9wYWNpdHk6IDAuMTg7IH0NCi5wbG90LmlzbyAuYmFyOm5vdCgub24pIC5sYWIgeyBvcGFjaXR5OiAwLjY7IH0NCi54bGFiZWxzIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS15dykgbWlubWF4KDAsIDFmcik7IG1hcmdpbi10b3A6IDhweDsgfQ0KLnhyb3cgeyBncmlkLWNvbHVtbjogMjsgZGlzcGxheTogZmxleDsgfQ0KLnhsIHsgZmxleDogMSAxIDA7IG1pbi13aWR0aDogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDEzLjVweDsgZm9udC13ZWlnaHQ6IDUwMDsgbGluZS1oZWlnaHQ6IDEuMzsgcGFkZGluZzogMCA0cHg7IH0NCi54bCBzbWFsbCB7IGRpc3BsYXk6IGJsb2NrOyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4OyB9DQoueHRpdGxlIHsgZ3JpZC1jb2x1bW46IDI7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMTBweDsgfQ0KLmdsYWIgeyBkaXNwbGF5OiBub25lOyB9DQoNCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSkgew0KICAucmV2ZWFsIC5iYXIgeyB0cmFuc2Zvcm06IHNjYWxlWSgwKTsgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGJvdHRvbTsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuNnMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksIG9wYWNpdHkgMC4ycyBlYXNlOyB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWksIDApICogNDBtcyk7IH0NCiAgLnJldmVhbC5pbiAuYmFyIHsgdHJhbnNmb3JtOiBub25lOyB9DQogIC5yZXZlYWwgLmJhciAubGFiIHsgb3BhY2l0eTogMDsgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjRzIGVhc2U7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0MG1zICsgMzAwbXMpOyB9DQogIC5yZXZlYWwuaW4gLmJhciAubGFiIHsgb3BhY2l0eTogMTsgfQ0KICAucmV2ZWFsIC5hbm5vIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDRweCk7IHRyYW5zaXRpb246IG9wYWNpdHkgMC40cyBlYXNlIDAuNXMsIHRyYW5zZm9ybSAwLjRzIGVhc2UgMC41czsgfQ0KICAucmV2ZWFsLmluIC5hbm5vIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9DQogIC5yZXZlYWwuaW4uc2V0dGxlZCAuYmFyLCAucmV2ZWFsLmluLnNldHRsZWQgLmJhciAubGFiIHsgdHJhbnNpdGlvbi1kZWxheTogMHM7IH0NCn0NCg0KQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7DQogIC5mbGlwIC5wbG90IHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IH0NCiAgLmZsaXAgLmFyZWEgeyBncmlkLWNvbHVtbjogMTsgaGVpZ2h0OiBhdXRvOyBtYXJnaW4tYm90dG9tOiAyNnB4OyB9DQogIC5mbGlwIC55bGluZXMgeyBpbnNldDogMCB2YXIoLS1oZywgNTZweCkgMCAwOyB9DQogIC5mbGlwIC55bCB7IGxlZnQ6IHZhcigtLXApOyByaWdodDogYXV0bzsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiAxcHg7IGhlaWdodDogYXV0bzsgfQ0KICAuZmxpcCAueWwgaSB7IHJpZ2h0OiBhdXRvOyBsZWZ0OiA1MCU7IHRvcDogY2FsYygxMDAlICsgNnB4KTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOyB9DQogIC5mbGlwIC5ncm91cHMgeyBwb3NpdGlvbjogc3RhdGljOyBkaXNwbGF5OiBibG9jazsgcGFkZGluZy1yaWdodDogdmFyKC0taGcsIDU2cHgpOyB9DQogIC5mbGlwIC5ncm91cCB7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAwIDAgMThweDsgfQ0KICAuZmxpcCAuZ3JvdXA6bGFzdC1jaGlsZCB7IHBhZGRpbmctYm90dG9tOiAwOyB9DQogIC5mbGlwIC5hbm5vIHsgcG9zaXRpb246IHN0YXRpYzsgdGV4dC1hbGlnbjogbGVmdDsgbWFyZ2luOiAycHggMCA2cHg7IH0NCiAgLmZsaXAgLmFubm8gc21hbGwgeyBkaXNwbGF5OiBpbmxpbmU7IG1hcmdpbi1sZWZ0OiA2cHg7IH0NCiAgLmZsaXAgLmJhcnMgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsgfQ0KICAuZmxpcCAuYmFyIHsgZmxleDogbm9uZTsgd2lkdGg6IHZhcigtLXYpOyBoZWlnaHQ6IDE2cHg7IG1pbi13aWR0aDogMnB4OyB9DQogIC5mbGlwIC5iYXIgLmxhYiB7IGJvdHRvbTogYXV0bzsgbGVmdDogMTAwJTsgdG9wOiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsgbWFyZ2luOiAwIDAgMCA2cHg7IH0NCiAgLmZsaXAgLnhsYWJlbHMgeyBkaXNwbGF5OiBub25lOyB9DQogIC5mbGlwIC5nbGFiIHsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogMCAwIDZweDsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNTAwOyB9DQogIC5mbGlwIC5nbGFiIHNtYWxsIHsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7IH0NCiAgLmZsaXAgLmJhcnMgeyBtYXJnaW4tdG9wOiAycHg7IH0NCiAgQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7DQogICAgLnJldmVhbC5mbGlwIC5iYXIgeyB0cmFuc2Zvcm06IHNjYWxlWCgwKTsgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7IH0NCiAgICAucmV2ZWFsLmZsaXAuaW4gLmJhciB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICB9DQp9DQoNCi5wbG90IHsgLS1oOiAzMDBweDsgfSAucGxvdCwgLnhsYWJlbHMgeyAtLXl3OiA1MnB4OyB9DQouZ3JvdXAgeyBwYWRkaW5nOiAwIDQlOyBnYXA6IDVweDsgfQ0KLmJhciB7IC0tYnc6IDU0cHg7IH0NCkBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCkgeyAucGxvdCB7IC0taDogMjYwcHg7IH0gLmFubm8gc21hbGwgeyBkaXNwbGF5OiBub25lOyB9IC5iYXIgLmxhYiB7IGZvbnQtc2l6ZTogMTFweDsgfSB9DQpAbWVkaWEgKG1heC13aWR0aDogNzAwcHgpIHsgLnhsIHsgZm9udC1zaXplOiAxMi41cHg7IH0gLmFubm8geyBmb250LXNpemU6IDExcHg7IH0gfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7IC5hbm5vIHNtYWxsIHsgZGlzcGxheTogaW5saW5lOyB9IC5mbGlwIC55bGluZXMgeyBpbnNldDogMCA2NHB4IDAgMDsgfSAuZmxpcCAuZ3JvdXBzIHsgcGFkZGluZy1yaWdodDogNjRweDsgfSB9DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQo8ZGl2IGNsYXNzPSJ3cmFwIiBpZD0icm9vdCI+DQogIDxoZWFkZXIgY2xhc3M9ImhlYWQiPg0KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSI+U3BlZWQ8L3NwYW4+DQogICAgPGgxPlNwZWVkIHBlciBjbGFzc2lmaWNhdGlvbjwvaDE+DQogICAgPHAgY2xhc3M9InN1YiI+PHNwYW4gY2xhc3M9ImRpciI+TG93ZXIgaXMgYmV0dGVyLjwvc3Bhbj4gTWVhbiB3YWxsLWNsb2NrIHRpbWUgdG8gY2xhc3NpZnkgb25lIHRleHQsIG9uIHRoZSBzYW1lIHRocmVlIGRhdGFzZXRzIGFzIHRoZSBjb3N0IGNvbXBhcmlzb24uPC9wPg0KICA8L2hlYWRlcj4NCg0KICA8ZGl2IGNsYXNzPSJjb250cm9scyI+DQogICAgPGRpdiBjbGFzcz0iayI+TWVhbiB0aW1lIHBlciByZXZpZXcgJm1pZGRvdDsgbG9nIHNjYWxlPC9kaXY+DQogICAgPGRpdiBjbGFzcz0ibGVnZW5kIiBpZD0ibGVnZW5kIiByb2xlPSJncm91cCIgYXJpYS1sYWJlbD0iSGlnaGxpZ2h0IGEgbW9kZWwiPjwvZGl2Pg0KICA8L2Rpdj4NCiAgPGRpdiBjbGFzcz0icmV2ZWFsIGZsaXAiIGlkPSJjaGFydCI+DQogICAgPGRpdiBjbGFzcz0icGxvdCIgaWQ9InBsb3QiPg0KICAgICAgPGRpdiBjbGFzcz0iYXJlYSI+DQogICAgICAgIDxkaXYgY2xhc3M9InlsaW5lcyIgaWQ9InlsaW5lcyIgYXJpYS1oaWRkZW49InRydWUiPjwvZGl2Pg0KICAgICAgICA8ZGl2IGNsYXNzPSJncm91cHMiIGlkPSJncm91cHMiPjwvZGl2Pg0KICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQogICAgPGRpdiBjbGFzcz0ieGxhYmVscyIgYXJpYS1oaWRkZW49InRydWUiPjxkaXY+PC9kaXY+PGRpdiBjbGFzcz0ieHJvdyIgaWQ9Inhyb3ciPjwvZGl2PjwvZGl2Pg0KICA8L2Rpdj4NCiAgPHAgY2xhc3M9Im5vdGUiPkJhcnMgYXJlIG9uIGEgbG9nIHNjYWxlLCBzbyBlYWNoIGdyaWRsaW5lIGlzIGEgdGVuZm9sZCBjaGFuZ2UgaW4gdGltZS4gTWljcm9zb2Z0LURlY2lzaW9uLTEgYW5zd2VycyBldmVyeSBkYXRhc2V0IGluIHVuZGVyIDxzcGFuIGNsYXNzPSJudW0iPjIwMCBtczwvc3Bhbj4gcGVyIHRleHQ7IEdQVC02IFNvbCB0YWtlcyBiZXR3ZWVuIDxzcGFuIGNsYXNzPSJudW0iPjIuNjwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJudW0iPjIuOCBzPC9zcGFuPi48L3A+DQoNCiAgPGRpdiBjbGFzcz0idGlwIiBpZD0idGlwIiByb2xlPSJ0b29sdGlwIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9kaXY+DQo8L2Rpdj4NCjxzY3JpcHQ+DQooZnVuY3Rpb24gKCkgew0KICB2YXIgbW90aW9uID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKScpLm1hdGNoZXM7DQogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QnKTsNCiAgdmFyIHRpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aXAnKTsNCg0KICBmdW5jdGlvbiBlbCh0YWcsIGNscywgdGV4dCkgew0KICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOw0KICAgIGlmIChjbHMpIG4uY2xhc3NOYW1lID0gY2xzOw0KICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGV4dCAhPT0gbnVsbCkgbi50ZXh0Q29udGVudCA9IHRleHQ7DQogICAgcmV0dXJuIG47DQogIH0NCiAgZnVuY3Rpb24gc2V0VmFyKG4sIGssIHYpIHsgbi5zdHlsZS5zZXRQcm9wZXJ0eShrLCB2KTsgfQ0KICBmdW5jdGlvbiBmbXROKG4sIGQpIHsgcmV0dXJuIG4udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IGQsIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZCB9KTsgfQ0KDQogIC8vIC0tLS0gVG9vbHRpcCAoaG92ZXIsIGtleWJvYXJkIGZvY3VzIGFuZCB0YXApIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICB2YXIgaG90ID0gbnVsbDsNCiAgZnVuY3Rpb24gcmVuZGVyVGlwKHNwZWMpIHsNCiAgICB0aXAuaW5uZXJIVE1MID0gJyc7DQogICAgaWYgKHNwZWMudGl0bGUpIHRpcC5hcHBlbmRDaGlsZChlbCgnZGl2JywgJ3QnLCBzcGVjLnRpdGxlKSk7DQogICAgKHNwZWMucm93cyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAocikgew0KICAgICAgdmFyIHJvdyA9IGVsKCdkaXYnLCAncicgKyAoclsyXSA/ICcgJyArIHJbMl0gOiAnJykpOw0KICAgICAgcm93LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgclswXSkpOw0KICAgICAgcm93LmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ251bScsIHJbMV0pKTsNCiAgICAgIHRpcC5hcHBlbmRDaGlsZChyb3cpOw0KICAgIH0pOw0KICAgIGlmIChzcGVjLm5vdGUpIHRpcC5hcHBlbmRDaGlsZChlbCgnZGl2JywgJ3MnLCBzcGVjLm5vdGUpKTsNCiAgfQ0KICBmdW5jdGlvbiBwbGFjZVRpcChub2RlLCBwcmVmZXIpIHsNCiAgICB2YXIgcnIgPSByb290LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KICAgIHZhciBuciA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQogICAgdmFyIHR3ID0gdGlwLm9mZnNldFdpZHRoLCB0aCA9IHRpcC5vZmZzZXRIZWlnaHQ7DQogICAgdmFyIGxlZnQgPSBuci5sZWZ0IC0gcnIubGVmdCArIChwcmVmZXIgPT09ICdhYm92ZScgPyBuci53aWR0aCAvIDIgLSB0dyAvIDIgOiAwKTsNCiAgICBsZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGVmdCwgcnIud2lkdGggLSB0dykpOw0KICAgIHZhciBiZWxvdyA9IG5yLmJvdHRvbSAtIHJyLnRvcCArIDY7DQogICAgdmFyIGFib3ZlID0gbnIudG9wIC0gcnIudG9wIC0gdGggLSAocHJlZmVyID09PSAnYWJvdmUnID8gMjYgOiA2KTsNCiAgICB2YXIgdG9wOw0KICAgIGlmIChwcmVmZXIgPT09ICdhYm92ZScpIHRvcCA9IGFib3ZlID49IDAgPyBhYm92ZSA6IE1hdGgubWluKGJlbG93LCByci5oZWlnaHQgLSB0aCk7DQogICAgZWxzZSB0b3AgPSAoYmVsb3cgKyB0aCA8PSByci5oZWlnaHQpID8gYmVsb3cgOiBNYXRoLm1heCgwLCBhYm92ZSk7DQogICAgLy8gU3RheSBpbnNpZGUgdGhlIHdpZGdldCBzbyB0aGUgYXV0by1zaXplZCBmcmFtZSBuZXZlciBjbGlwcyB0aGUgdGlwLg0KICAgIHRpcC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7DQogICAgdGlwLnN0eWxlLnRvcCA9IE1hdGgubWF4KDAsIHRvcCkgKyAncHgnOw0KICB9DQogIGZ1bmN0aW9uIHNob3dUaXAobm9kZSwgYnVpbGQsIHByZWZlcikgew0KICAgIGlmIChob3QgPT09IG5vZGUpIHJldHVybjsNCiAgICBoaWRlVGlwKCk7DQogICAgaG90ID0gbm9kZTsNCiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ2hvdCcpOw0KICAgIHJlbmRlclRpcChidWlsZChub2RlKSk7DQogICAgdGlwLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsNCiAgICB0aXAuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICdmYWxzZScpOw0KICAgIHBsYWNlVGlwKG5vZGUsIHByZWZlcik7DQogIH0NCiAgZnVuY3Rpb24gaGlkZVRpcCgpIHsNCiAgICBpZiAoaG90KSBob3QuY2xhc3NMaXN0LnJlbW92ZSgnaG90Jyk7DQogICAgaG90ID0gbnVsbDsNCiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpOw0KICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsNCiAgfQ0KICBmdW5jdGlvbiBiaW5kVGlwcyhzZWxlY3RvciwgYnVpbGQsIHByZWZlcikgew0KICAgIGZ1bmN0aW9uIGZpbmQodCkgew0KICAgICAgdmFyIG4gPSB0Ow0KICAgICAgd2hpbGUgKG4gJiYgbiAhPT0gcm9vdCkgew0KICAgICAgICBpZiAobi5tYXRjaGVzICYmIG4ubWF0Y2hlcyhzZWxlY3RvcikpIHJldHVybiBuOw0KICAgICAgICBuID0gbi5wYXJlbnROb2RlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSBmaW5kKGUudGFyZ2V0KTsgaWYgKG4pIHNob3dUaXAobiwgYnVpbGQsIHByZWZlcik7IH0pOw0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobiAmJiAhbi5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSBoaWRlVGlwKCk7IH0pOw0KICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuKSBzaG93VGlwKG4sIGJ1aWxkLCBwcmVmZXIpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSBmaW5kKGUudGFyZ2V0KTsgaWYgKG4gJiYgIW4uY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSkgaGlkZVRpcCgpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkgeyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBoaWRlVGlwKCk7IH0pOw0KICB9DQoNCiAgLy8gLS0tLSBDb3VudC11cCAodmlzaWJpbGl0eS10cmlnZ2VyZWQgdmlhIHJldmVhbCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICB2YXIgRUFTRSA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiAxIC0gTWF0aC5wb3coMSAtIHQsIDMpOyB9Ow0KICBmdW5jdGlvbiBjb3VudFVwKG5vZGUsIHRvLCBmbXQsIG1zLCBkZWxheSkgew0KICAgIGlmICghbW90aW9uKSB7IG5vZGUudGV4dENvbnRlbnQgPSBmbXQodG8pOyByZXR1cm47IH0NCiAgICB2YXIgc3RhcnQgPSBudWxsOw0KICAgIG5vZGUudGV4dENvbnRlbnQgPSBmbXQoMCk7DQogICAgZnVuY3Rpb24gZnJhbWUobm93KSB7DQogICAgICBpZiAoc3RhcnQgPT09IG51bGwpIHN0YXJ0ID0gbm93ICsgKGRlbGF5IHx8IDApOw0KICAgICAgdmFyIHQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCAobm93IC0gc3RhcnQpIC8gbXMpKTsNCiAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBmbXQodG8gKiBFQVNFKHQpKTsNCiAgICAgIGlmICh0IDwgMSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTsNCiAgICB9DQogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTsNCiAgfQ0KDQogIC8vIC0tLS0gUmV2ZWFsIChJbnRlcnNlY3Rpb25PYnNlcnZlciBvbmx5OyBubyB0aW1lcnMgc3RhcnQgYW55dGhpbmcpIC0tLS0tLQ0KICAvLyBgc2V0dGxlZGAgcmVtb3ZlcyBzdGFnZ2VyIGRlbGF5cyBvbmNlIHRoZSBlbnRyYW5jZSBoYXMgcGxheWVkIHNvIGhvdmVyLA0KICAvLyB0b2dnbGVzIGFuZCBmaWx0ZXJzIHJlc3BvbmQgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcy4NCiAgZnVuY3Rpb24gcmV2ZWFsKGdyb3VwLCBjb3VudCwgY2IpIHsNCiAgICBncm91cC5jbGFzc0xpc3QuYWRkKCdpbicpOw0KICAgIGlmIChjYikgY2IoKTsNCiAgICBpZiAoIW1vdGlvbikgeyBncm91cC5jbGFzc0xpc3QuYWRkKCdzZXR0bGVkJyk7IHJldHVybjsgfQ0KICAgIHZhciB3YWl0ID0gTWF0aC5taW4oY291bnQsIDMwKSAqIDQ1ICsgNzAwOw0KICAgIHZhciB0MCA9IHBlcmZvcm1hbmNlLm5vdygpOw0KICAgIChmdW5jdGlvbiB0aWNrKG5vdykgeyBpZiAobm93IC0gdDAgPj0gd2FpdCkgZ3JvdXAuY2xhc3NMaXN0LmFkZCgnc2V0dGxlZCcpOyBlbHNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTsgfSkodDApOw0KICB9DQogIGZ1bmN0aW9uIG9ic2VydmUoaXRlbXMpIHsgLy8gaXRlbXM6IFtbbm9kZSwgZm5dXQ0KICAgIGlmICgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdykgew0KICAgICAgdmFyIGlvID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7DQogICAgICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkgew0KICAgICAgICAgIGlmICghZS5pc0ludGVyc2VjdGluZykgcmV0dXJuOw0KICAgICAgICAgIGlvLnVub2JzZXJ2ZShlLnRhcmdldCk7DQogICAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsgaWYgKGl0WzBdID09PSBlLnRhcmdldCkgaXRbMV0oKTsgfSk7DQogICAgICAgIH0pOw0KICAgICAgfSwgeyB0aHJlc2hvbGQ6IDAuMDUgfSk7DQogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyBpby5vYnNlcnZlKGl0WzBdKTsgfSk7DQogICAgfSBlbHNlIHsNCiAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7IGl0WzFdKCk7IH0pOw0KICAgIH0NCiAgfQ0KICB2YXIgaGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkJyk7DQoNCiAgdmFyIERBVEEgPSB7DQogICAgc2VyaWVzOiBbDQogICAgICBbJ0dQVC02IFNvbCcsICdyZWYnXSwNCiAgICAgIFsnTWljcm9zb2Z0LURlY2lzaW9uLTEnLCAncHJpJ10NCiAgICBdLA0KICAgIGdyb3VwczogWw0KICAgICAgLy8gZGF0YXNldCwgdW5pdCwgW0dQVC02IFNvbCwgTUQxXSBtZWFuIG1zIHBlciByZXZpZXcsICJmYXN0ZXIiIGFubm90YXRpb24NCiAgICAgIFsnUmFjaW5nIFRpdGxlJywgJzc1MyByZXZpZXdzJywgWzI4MDAsIDE1OV0sICcxOCddLA0KICAgICAgWydGaXJzdC1QZXJzb24gU2hvb3RlcicsICczNDEgcmV2aWV3cycsIFsyNjAwLCAxODhdLCAnMTQnXSwNCiAgICAgIFsnU3R1ZGlvIExpdmVzdHJlYW0nLCAnMTAzMCBwb3N0cycsIFsyNjAwLCAxNDNdLCAnMTgnXQ0KICAgIF0sDQogICAgZG9tYWluOiBbNTAsIDEwMDAwXSwNCiAgICB0aWNrczogW1sxMDAsICcxMDAgbXMnXSwgWzEwMDAsICcxIHMnXSwgWzEwMDAwLCAnMTAgcyddXQ0KICB9Ow0KICBmdW5jdGlvbiBtcyh2KSB7IHJldHVybiB2ID49IDEwMDAgPyBmbXROKHYgLyAxMDAwLCAxKSArICcgcycgOiBNYXRoLnJvdW5kKHYpICsgJyBtcyc7IH0NCiAgZnVuY3Rpb24gcGN0KHYpIHsNCiAgICB2YXIgbG8gPSBNYXRoLmxvZyhEQVRBLmRvbWFpblswXSksIGhpID0gTWF0aC5sb2coREFUQS5kb21haW5bMV0pOw0KICAgIHJldHVybiBNYXRoLm1heCgwLCAoTWF0aC5sb2coTWF0aC5tYXgodiwgREFUQS5kb21haW5bMF0pKSAtIGxvKSAvIChoaSAtIGxvKSAqIDEwMCk7DQogIH0NCg0KICB2YXIgeWxpbmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3lsaW5lcycpOw0KICB2YXIgZ3JvdXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dyb3VwcycpOw0KICB2YXIgeHJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd4cm93Jyk7DQogIHZhciBjb3VudGVycyA9IFtdOw0KICB2YXIgayA9IDA7DQoNCiAgREFUQS50aWNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7DQogICAgdmFyIHkgPSBlbCgnc3BhbicsICd5bCcpOyBzZXRWYXIoeSwgJy0tcCcsIHBjdCh0WzBdKSArICclJyk7DQogICAgeS5hcHBlbmRDaGlsZChlbCgnaScsIG51bGwsIHRbMV0pKTsgeWxpbmVzLmFwcGVuZENoaWxkKHkpOw0KICB9KTsNCiAgdmFyIGJhc2UgPSBlbCgnc3BhbicsICd5bCBiYXNlJyk7IHNldFZhcihiYXNlLCAnLS1wJywgJzAlJyk7IHlsaW5lcy5hcHBlbmRDaGlsZChiYXNlKTsNCg0KICBEQVRBLmdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uIChnLCBnaSkgew0KICAgIHZhciBncm91cCA9IGVsKCdkaXYnLCAnZ3JvdXAnKTsNCiAgICB2YXIgZ2xhYiA9IGVsKCdkaXYnLCAnZ2xhYicsIGdbMF0pOyBnbGFiLmFwcGVuZENoaWxkKGVsKCdzbWFsbCcsIG51bGwsIGdbMV0pKTsNCiAgICBncm91cC5hcHBlbmRDaGlsZChnbGFiKTsNCiAgICB2YXIgYW5ubyA9IGVsKCdkaXYnLCAnYW5ubycsICd+JyArIGdbM10gKyAnw5cgZmFzdGVyJyk7DQogICAgYW5uby5hcHBlbmRDaGlsZChlbCgnc21hbGwnLCBudWxsLCAnTWljcm9zb2Z0LURlY2lzaW9uLTEgdnMgR1BULTYgU29sJykpOw0KICAgIGdyb3VwLmFwcGVuZENoaWxkKGFubm8pOw0KICAgIHZhciBiYXJzID0gZWwoJ2RpdicsICdiYXJzJyk7DQogICAgREFUQS5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbiAocywgc2kpIHsNCiAgICAgIHZhciB2ID0gZ1syXVtzaV07DQogICAgICB2YXIgYmFyID0gZWwoJ2J1dHRvbicsICdiYXIgJyArIHNbMV0gKyAnIHMnICsgc2kpOyBiYXIudHlwZSA9ICdidXR0b24nOw0KICAgICAgc2V0VmFyKGJhciwgJy0tdicsIHBjdCh2KSArICclJyk7IHNldFZhcihiYXIsICctLWknLCBTdHJpbmcoaysrKSk7DQogICAgICBiYXIuZGF0YXNldC5nID0gU3RyaW5nKGdpKTsgYmFyLmRhdGFzZXQucyA9IFN0cmluZyhzaSk7DQogICAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc1swXSArICcsICcgKyBnWzBdICsgJzogJyArIG1zKHYpICsgJyBtZWFuIHRpbWUgcGVyIHJldmlldycpOw0KICAgICAgdmFyIGxhYiA9IGVsKCdzcGFuJywgJ2xhYicsIG1zKHYpKTsgY291bnRlcnMucHVzaChbbGFiLCB2XSk7DQogICAgICBiYXIuYXBwZW5kQ2hpbGQobGFiKTsgYmFycy5hcHBlbmRDaGlsZChiYXIpOw0KICAgIH0pOw0KICAgIGdyb3VwLmFwcGVuZENoaWxkKGJhcnMpOw0KICAgIGdyb3Vwcy5hcHBlbmRDaGlsZChncm91cCk7DQogICAgdmFyIHhsID0gZWwoJ2RpdicsICd4bCcsIGdbMF0pOyB4bC5hcHBlbmRDaGlsZChlbCgnc21hbGwnLCBudWxsLCBnWzFdKSk7DQogICAgeHJvdy5hcHBlbmRDaGlsZCh4bCk7DQogIH0pOw0KDQogIHZhciBsZWdlbmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGVnZW5kJyk7DQogIHZhciBwbG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bsb3QnKTsNCiAgREFUQS5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbiAocywgc2kpIHsNCiAgICB2YXIgYiA9IGVsKCdidXR0b24nLCBudWxsKTsgYi50eXBlID0gJ2J1dHRvbic7DQogICAgYi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpOyBiLmRhdGFzZXQucyA9IFN0cmluZyhzaSk7DQogICAgYi5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdzdyAnICsgc1sxXSkpOyBiLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgbnVsbCwgc1swXSkpOw0KICAgIGxlZ2VuZC5hcHBlbmRDaGlsZChiKTsNCiAgfSk7DQogIHZhciBpc28gPSBudWxsOw0KICBsZWdlbmQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgew0KICAgIHZhciBiID0gZS50YXJnZXQuY2xvc2VzdCgnYnV0dG9uJyk7IGlmICghYikgcmV0dXJuOw0KICAgIGlzbyA9IGlzbyA9PT0gYi5kYXRhc2V0LnMgPyBudWxsIDogYi5kYXRhc2V0LnM7DQogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsZWdlbmQucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyksIGZ1bmN0aW9uICh4KSB7IHguc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB4LmRhdGFzZXQucyA9PT0gaXNvID8gJ3RydWUnIDogJ2ZhbHNlJyk7IH0pOw0KICAgIGxlZ2VuZC5jbGFzc0xpc3QudG9nZ2xlKCdpc28nLCBpc28gIT09IG51bGwpOw0KICAgIHBsb3QuY2xhc3NMaXN0LnRvZ2dsZSgnaXNvJywgaXNvICE9PSBudWxsKTsNCiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHBsb3QucXVlcnlTZWxlY3RvckFsbCgnLmJhcicpLCBmdW5jdGlvbiAoYmFyKSB7IGJhci5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIGJhci5kYXRhc2V0LnMgPT09IGlzbyk7IH0pOw0KICB9KTsNCg0KICBiaW5kVGlwcygnLmJhcicsIGZ1bmN0aW9uIChiYXIpIHsNCiAgICB2YXIgZyA9IERBVEEuZ3JvdXBzWytiYXIuZGF0YXNldC5nXSwgc2kgPSArYmFyLmRhdGFzZXQucywgcyA9IERBVEEuc2VyaWVzW3NpXTsNCiAgICB2YXIgc3BlYyA9IHsgdGl0bGU6IHNbMF0gKyAnIMK3ICcgKyBnWzBdLCByb3dzOiBbWydNZWFuIHRpbWUgcGVyIHJldmlldycsIG1zKGdbMl1bc2ldKSwgc1sxXSA9PT0gJ3ByaScgPyAnaGknIDogJyddLCBbJ0RhdGFzZXQnLCBnWzFdXV0gfTsNCiAgICBzcGVjLm5vdGUgPSBzaSA9PT0gMSA/ICd+JyArIGdbM10gKyAnw5cgZmFzdGVyIHRoYW4gR1BULTYgU29sIG9uIHRoaXMgZGF0YXNldC4nIDogJ01lYW4gd2FsbC1jbG9jayB0aW1lIHRvIGNsYXNzaWZ5IG9uZSB0ZXh0Lic7DQogICAgcmV0dXJuIHNwZWM7DQogIH0sICdhYm92ZScpOw0KDQogIHZhciBjaGFydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFydCcpOw0KICBvYnNlcnZlKFsNCiAgICBbaGVhZCwgZnVuY3Rpb24gKCkgeyBoZWFkLmNsYXNzTGlzdC5hZGQoJ2luJyk7IH1dLA0KICAgIFtjaGFydCwgZnVuY3Rpb24gKCkgew0KICAgICAgcmV2ZWFsKGNoYXJ0LCBjb3VudGVycy5sZW5ndGgsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgY291bnRlcnMuZm9yRWFjaChmdW5jdGlvbiAoYykgeyBjb3VudFVwKGNbMF0sIGNbMV0sIG1zLCA4MDAsIDI1MCk7IH0pOw0KICAgICAgfSk7DQogICAgfV0NCiAgXSk7DQoNCn0pKCk7DQo8L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4NCg==PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNlY3VyaXR5LVBvbGljeSIgY29udGVudD0iZGVmYXVsdC1zcmMgJ25vbmUnOyBzY3JpcHQtc3JjICd1bnNhZmUtaW5saW5lJyAndW5zYWZlLWV2YWwnOyBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnOyBpbWctc3JjIGRhdGE6IGJsb2I6IGh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3VwbG9hZHMvOyBmb250LXNyYyBkYXRhOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb207IG1lZGlhLXNyYyBkYXRhOiBibG9iOiBodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC91cGxvYWRzLzsiPg0KPG1ldGEgY2hhcnNldD0idXRmLTgiPg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj4NCjx0aXRsZT5Db3N0IHBlciBydW48L3RpdGxlPg0KPHN0eWxlPg0KQGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLUJvb2sub3RmIikgZm9ybWF0KCJvcGVudHlwZSIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJQUCBOZXVlIE1vbnRyZWFsIjtmb250LXdlaWdodDo1MDA7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvUFBOZXVlTW9udHJlYWwtTWVkaXVtLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUFAgTmV1ZSBNb250cmVhbCI7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtZGlzcGxheTpzd2FwO3NyYzp1cmwoImh0dHBzOi8vY29tbWFuZGxpbmUubWljcm9zb2Z0LmNvbS93cC1jb250ZW50L3RoZW1lcy9jb21tYW5kLWxpbmUvYXNzZXRzL2ZvbnRzL1BQTmV1ZU1vbnRyZWFsLUJvbGQub3RmIikgZm9ybWF0KCJvcGVudHlwZSIpO31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJQUCBOZXVlIE1vbnRyZWFsIjtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvUFBOZXVlTW9udHJlYWwtSXRhbGljLm90ZiIpIGZvcm1hdCgib3BlbnR5cGUiKTt9QGZvbnQtZmFjZXtmb250LWZhbWlseToiQ2FzY2FkaWEgQ29kZSI7Zm9udC13ZWlnaHQ6MjAwIDcwMDtmb250LXN0eWxlOm5vcm1hbDtmb250LWRpc3BsYXk6c3dhcDtzcmM6dXJsKCJodHRwczovL2NvbW1hbmRsaW5lLm1pY3Jvc29mdC5jb20vd3AtY29udGVudC90aGVtZXMvY29tbWFuZC1saW5lL2Fzc2V0cy9mb250cy9DYXNjYWRpYUNvZGUud29mZjIiKSBmb3JtYXQoIndvZmYyIik7fUBmb250LWZhY2V7Zm9udC1mYW1pbHk6IkNhc2NhZGlhIENvZGUiO2ZvbnQtd2VpZ2h0OjIwMCA3MDA7Zm9udC1zdHlsZTppdGFsaWM7Zm9udC1kaXNwbGF5OnN3YXA7c3JjOnVybCgiaHR0cHM6Ly9jb21tYW5kbGluZS5taWNyb3NvZnQuY29tL3dwLWNvbnRlbnQvdGhlbWVzL2NvbW1hbmQtbGluZS9hc3NldHMvZm9udHMvQ2FzY2FkaWFDb2RlSXRhbGljLndvZmYyIikgZm9ybWF0KCJ3b2ZmMiIpO30NCjpyb290IHsNCiAgLS1iZzogI2ZmZjsNCiAgLS1pbms6ICMwMDA7DQogIC0tbXV0ZWQ6ICM1NTU7DQogIC0tZmFpbnQ6ICNjOWM5Yzk7ICAgICAgICAvKiBzZWNvbmRhcnkgc2VyaWVzICovDQogIC0tZ29vZDogI0UzRjY3MTsgICAgICAgICAvKiBwcmltYXJ5IG1vZGVsIChzaXRlIGFjY2VudCBsaW1lKSAqLw0KICAtLWJhZDogI0ZGQTAzNzsgICAgICAgICAgLyogcHJpbWFyeSBtb2RlbCBiZWhpbmQgKHNpdGUgYWNjZW50IG9yYW5nZSkgKi8NCiAgLS1ydWxlOiAjMDAwOw0KICAtLXJ1bGUtc29mdDogI2U2ZTZlNjsNCiAgLS1ob3ZlcjogI2YzZjNmMzsNCiAgLS1iYWRnZS1iZzogIzAwMDsNCiAgLS1iYWRnZS1mZzogI2ZmZjsNCiAgLS10aXAtYmc6ICMwMDA7DQogIC0tdGlwLWZnOiAjZmZmOw0KICAtLXNhbnM6ICJQUCBOZXVlIE1vbnRyZWFsIiwgc2Fucy1zZXJpZjsNCiAgLS1tb25vOiAiQ2FzY2FkaWEgQ29kZSIsIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAiTGliZXJhdGlvbiBNb25vIiwgbW9ub3NwYWNlOw0KfQ0KaHRtbFtkYXRhLXRoZW1lPSJkYXJrIl0gew0KICAtLWJnOiAjMTExOw0KICAtLWluazogI2ZmZjsNCiAgLS1tdXRlZDogIzk5OTsNCiAgLS1mYWludDogIzQ0NDsNCiAgLS1ydWxlOiAjZmZmOw0KICAtLXJ1bGUtc29mdDogIzJhMmEyYTsNCiAgLS1ob3ZlcjogIzFmMWYxZjsNCiAgLS1iYWRnZS1iZzogI2ZmZjsNCiAgLS1iYWRnZS1mZzogIzExMTsNCiAgLS10aXAtYmc6ICNmZmY7DQogIC0tdGlwLWZnOiAjMTExOw0KfQ0KDQoqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQ0KYm9keSB7DQogIG1hcmdpbjogMDsNCiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOw0KICBjb2xvcjogdmFyKC0taW5rKTsNCiAgZm9udC1mYW1pbHk6IHZhcigtLXNhbnMpOw0KICBmb250LXNpemU6IDE1cHg7DQogIGxpbmUtaGVpZ2h0OiAxLjQ1Ow0KICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsNCn0NCi53cmFwIHsgcG9zaXRpb246IHJlbGF0aXZlOyBwYWRkaW5nOiAycHggMCA2cHg7IH0NCi5udW0geyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7IH0NCi5rIHsNCiAgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOw0KICBmb250LXNpemU6IDExcHg7DQogIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07DQogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7DQogIGNvbG9yOiB2YXIoLS1tdXRlZCk7DQp9DQpidXR0b24geyBmb250OiBpbmhlcml0OyBjb2xvcjogaW5oZXJpdDsgYmFja2dyb3VuZDogbm9uZTsgYm9yZGVyOiAwOyBwYWRkaW5nOiAwOyBjdXJzb3I6IHBvaW50ZXI7IH0NCmJ1dHRvbjpmb2N1cy12aXNpYmxlLCBbdGFiaW5kZXhdOmZvY3VzLXZpc2libGUgeyBvdXRsaW5lOiAycHggc29saWQgdmFyKC0taW5rKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBIZWFkZXIgPT09PT09PT09PT09PT09PT0gKi8NCi5oZWFkIHsgbWFyZ2luLWJvdHRvbTogMjhweDsgdGV4dC1hbGlnbjogY2VudGVyOyB9DQouYmFkZ2Ugew0KICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogIHBhZGRpbmc6IDRweCA4cHg7DQogIGJhY2tncm91bmQ6IHZhcigtLWJhZGdlLWJnKTsNCiAgY29sb3I6IHZhcigtLWJhZGdlLWZnKTsNCiAgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOw0KICBmb250LXNpemU6IDEwcHg7DQogIGxpbmUtaGVpZ2h0OiAxOw0KICBsZXR0ZXItc3BhY2luZzogMC4wNmVtOw0KICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOw0KfQ0KaDEgew0KICBtYXJnaW46IDE4cHggMCA4cHg7DQogIGZvbnQtc2l6ZTogY2xhbXAoMjRweCwgNC4ydncsIDMycHgpOw0KICBmb250LXdlaWdodDogNTAwOw0KICBsZXR0ZXItc3BhY2luZzogLTAuMDE1ZW07DQogIGxpbmUtaGVpZ2h0OiAxLjEyOw0KfQ0KLnN1YiB7IG1hcmdpbjogMCBhdXRvOyBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxLjU7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1heC13aWR0aDogNjJjaDsgfQ0KLnN1YiAuZGlyIHsgY29sb3I6IHZhcigtLWluayk7IGZvbnQtd2VpZ2h0OiA1MDA7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gTGVnZW5kIC8gdG9nZ2xlcyA9PT09PT09PT09PT09PT09PSAqLw0KLmNvbnRyb2xzIHsNCiAgZGlzcGxheTogZmxleDsNCiAgZmxleC13cmFwOiB3cmFwOw0KICBhbGlnbi1pdGVtczogY2VudGVyOw0KICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogIGdhcDogMTBweCAyNHB4Ow0KICBtYXJnaW4tYm90dG9tOiAxOHB4Ow0KfQ0KLmxlZ2VuZCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA0cHggNnB4OyB9DQoubGVnZW5kIGJ1dHRvbiwgLnRvZ2dsZSBidXR0b24gew0KICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgZ2FwOiA4cHg7DQogIHBhZGRpbmc6IDVweCAxMXB4Ow0KICBmb250LXNpemU6IDEzcHg7DQogIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJ1bGUtc29mdCk7DQogIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cyBlYXNlLCBiYWNrZ3JvdW5kIDAuMTVzIGVhc2UsIG9wYWNpdHkgMC4ycyBlYXNlOw0KfQ0KLmxlZ2VuZCBidXR0b246aG92ZXIsIC50b2dnbGUgYnV0dG9uOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbmspOyB9DQoubGVnZW5kIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXSB7IGJvcmRlci1jb2xvcjogdmFyKC0taW5rKTsgZm9udC13ZWlnaHQ6IDUwMDsgfQ0KLmxlZ2VuZCAuc3cgeyB3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4OyBmbGV4OiAwIDAgMTBweDsgfQ0KLmxlZ2VuZCAuc3cucHJpIHsgYmFja2dyb3VuZDogdmFyKC0tZ29vZCk7IH0NCi5sZWdlbmQgLnN3LnJlZiB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IH0NCi5sZWdlbmQgLnN3Lm90aCB7IGJhY2tncm91bmQ6IHZhcigtLWZhaW50KTsgfQ0KLmxlZ2VuZC5pc28gYnV0dG9uOm5vdChbYXJpYS1wcmVzc2VkPSJ0cnVlIl0pIHsgb3BhY2l0eTogMC40NTsgfQ0KLmxlZ2VuZCBidXR0b25bYXJpYS1wcmVzc2VkPSJ0cnVlIl06OmFmdGVyIHsgY29udGVudDogIsK3IGNsaWNrIHRvIGNsZWFyIjsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLnRvZ2dsZSB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyB9DQoudG9nZ2xlIC5rIHsgbWFyZ2luLXJpZ2h0OiA4cHg7IH0NCi50b2dnbGUgYnV0dG9uW2FyaWEtcHJlc3NlZD0idHJ1ZSJdIHsgYmFja2dyb3VuZDogdmFyKC0taW5rKTsgY29sb3I6IHZhcigtLWJnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbmspOyB9DQoNCi8qID09PT09PT09PT09PT09PT09IE5vdGVzIC8gc291cmNlID09PT09PT09PT09PT09PT09ICovDQoubm90ZSB7IG1hcmdpbjogMTZweCAwIDA7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuNTsgY29sb3I6IHZhcigtLW11dGVkKTsgfQ0KLm5vdGUgLm51bSB7IGNvbG9yOiB2YXIoLS1pbmspOyB9DQouc291cmNlIHsgbWFyZ2luLXRvcDogMzJweDsgcGFkZGluZy10b3A6IDE0cHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ydWxlLXNvZnQpOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjU1OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB9DQouc291cmNlIHAgeyBtYXJnaW46IDAgMCA0cHg7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gVG9vbHRpcCA9PT09PT09PT09PT09PT09PSAqLw0KLnRpcCB7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgei1pbmRleDogMjsNCiAgbWF4LXdpZHRoOiAzMDBweDsNCiAgcGFkZGluZzogMTBweCAxMnB4Ow0KICBiYWNrZ3JvdW5kOiB2YXIoLS10aXAtYmcpOw0KICBjb2xvcjogdmFyKC0tdGlwLWZnKTsNCiAgZm9udC1zaXplOiAxM3B4Ow0KICBsaW5lLWhlaWdodDogMS40Ow0KICBwb2ludGVyLWV2ZW50czogbm9uZTsNCiAgb3BhY2l0eTogMDsNCiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjEycyBlYXNlOw0KfQ0KLnRpcC5zaG93IHsgb3BhY2l0eTogMTsgfQ0KLnRpcCAudCB7IGZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDZweDsgfQ0KLnRpcCAuciB7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgZ2FwOiAxNnB4OyB9DQoudGlwIC5yICsgLnIgeyBtYXJnaW4tdG9wOiAycHg7IH0NCi50aXAgLnIuaGkgeyBmb250LXdlaWdodDogNzAwOyB9DQoudGlwIC5yLmhpID4gc3BhbjpmaXJzdC1jaGlsZDo6YmVmb3JlIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDhweDsgaGVpZ2h0OiA4cHg7IG1hcmdpbi1yaWdodDogOHB4OyB2ZXJ0aWNhbC1hbGlnbjogMXB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kKTsgfQ0KLnRpcCAuci5oaS5iID4gc3BhbjpmaXJzdC1jaGlsZDo6YmVmb3JlIHsgYmFja2dyb3VuZDogdmFyKC0tYmFkKTsgfQ0KLnRpcCAucyB7IG1hcmdpbi10b3A6IDhweDsgcGFkZGluZy10b3A6IDZweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS10aXAtZmcpIDI1JSwgdHJhbnNwYXJlbnQpOyBmb250LXNpemU6IDEycHg7IG9wYWNpdHk6IDAuODU7IH0NCg0KLyogPT09PT09PT09PT09PT09PT0gTW90aW9uIChzaGFyZWQpID09PT09PT09PT09PT09PT09ICovDQpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpIHsNCiAgLmhlYWQgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzIGVhc2UsIHRyYW5zZm9ybSAwLjVzIGVhc2U7IH0NCiAgLmhlYWQuaW4geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7IH0NCn0NCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7DQogICogeyB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7IH0NCn0NCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgew0KICAuaGVhZCB7IG1hcmdpbi1ib3R0b206IDIycHg7IH0NCiAgLnN1YiB7IGZvbnQtc2l6ZTogMTVweDsgfQ0KICAubGVnZW5kIGJ1dHRvblthcmlhLXByZXNzZWQ9InRydWUiXTo6YWZ0ZXIgeyBjb250ZW50OiAiwrcgdGFwIHRvIGNsZWFyIjsgfQ0KfQ0KDQovKiA9PT09PT09PT09PT09PT09PSBWZXJ0aWNhbCBncm91cGVkIGJhcnMgPT09PT09PT09PT09PT09PT0gKi8NCi5wYW5lbHMgeyBkaXNwbGF5OiBncmlkOyBnYXA6IDI4cHggMzJweDsgfQ0KLnBhbmVsIHsgbWluLXdpZHRoOiAwOyB9DQoucHRpdGxlIHsgbWFyZ2luOiAwIDAgMTRweDsgZm9udC1zaXplOiAxNnB4OyBmb250LXdlaWdodDogNTAwOyBsZXR0ZXItc3BhY2luZzogLTAuMDFlbTsgfQ0KLnB0aXRsZSAucG0geyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWxlZnQ6IDhweDsgfQ0KLnBsb3QsIC54bGFiZWxzIHsgLS15dzogNDRweDsgfQ0KLnBsb3QgeyAtLWg6IDI4MHB4OyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLXl3KSBtaW5tYXgoMCwgMWZyKTsgfQ0KLmFyZWEgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGhlaWdodDogdmFyKC0taCk7IGdyaWQtY29sdW1uOiAyOyB9DQoueWxpbmVzIHsgcG9zaXRpb246IGFic29sdXRlOyBpbnNldDogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0NCi55bCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogdmFyKC0tcCk7IGhlaWdodDogMXB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1ydWxlLXNvZnQpOyB9DQoueWwuYmFzZSB7IGJhY2tncm91bmQ6IHZhcigtLXJ1bGUpOyB6LWluZGV4OiAxOyB9DQoueWwgaSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IGNhbGMoMTAwJSArIDhweCk7IHRvcDogNTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXNpemU6IDExcHg7IGxldHRlci1zcGFjaW5nOiAwLjA0ZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCi5ncm91cHMgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGluc2V0OiAwOyBkaXNwbGF5OiBmbGV4OyB9DQouYmFycyB7IGRpc3BsYXk6IGNvbnRlbnRzOyB9DQouZ3JvdXAgeyBwb3NpdGlvbjogcmVsYXRpdmU7IGZsZXg6IDEgMSAwOyBtaW4td2lkdGg6IDA7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogNHB4OyBwYWRkaW5nOiAwIDUlOyB9DQouYW5ubyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsgbGluZS1oZWlnaHQ6IDEuMzsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfQ0KLmFubm8gc21hbGwgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAxMHB4OyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogMC4wNGVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9DQouYmFyIHsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICBmbGV4OiAwIDEgdmFyKC0tYncsIDQ0cHgpOw0KICBtaW4td2lkdGg6IDEwcHg7DQogIGhlaWdodDogdmFyKC0tdik7DQogIGJhY2tncm91bmQ6IHZhcigtLWZhaW50KTsNCiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2U7DQp9DQouYmFyLnByaSB7IGJhY2tncm91bmQ6IHZhcigtLWdvb2QpOyB9DQouYmFyLnJlZiB7IGJhY2tncm91bmQ6IHZhcigtLWluayk7IH0NCi5iYXI6aG92ZXIsIC5iYXIuaG90IHsgZmlsdGVyOiBicmlnaHRuZXNzKDAuOTIpOyB9DQpodG1sW2RhdGEtdGhlbWU9ImRhcmsiXSAuYmFyOmhvdmVyLCBodG1sW2RhdGEtdGhlbWU9ImRhcmsiXSAuYmFyLmhvdCB7IGZpbHRlcjogYnJpZ2h0bmVzcygxLjI1KTsgfQ0KLmJhciAubGFiIHsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBib3R0b206IDEwMCU7DQogIGxlZnQ6IDUwJTsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOw0KICBtYXJnaW4tYm90dG9tOiA1cHg7DQogIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsNCiAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsNCiAgZm9udC1zaXplOiAxMnB4Ow0KICBjb2xvcjogdmFyKC0tbXV0ZWQpOw0KfQ0KLmJhci5wcmkgLmxhYiwgLmJhci5yZWYgLmxhYiB7IGNvbG9yOiB2YXIoLS1pbmspOyBmb250LXdlaWdodDogNzAwOyB9DQoucGxvdC5pc28gLmJhcjpub3QoLm9uKSB7IG9wYWNpdHk6IDAuMTg7IH0NCi5wbG90LmlzbyAuYmFyOm5vdCgub24pIC5sYWIgeyBvcGFjaXR5OiAwLjY7IH0NCi54bGFiZWxzIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS15dykgbWlubWF4KDAsIDFmcik7IG1hcmdpbi10b3A6IDhweDsgfQ0KLnhyb3cgeyBncmlkLWNvbHVtbjogMjsgZGlzcGxheTogZmxleDsgfQ0KLnhsIHsgZmxleDogMSAxIDA7IG1pbi13aWR0aDogMDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDEzLjVweDsgZm9udC13ZWlnaHQ6IDUwMDsgbGluZS1oZWlnaHQ6IDEuMzsgcGFkZGluZzogMCA0cHg7IH0NCi54bCBzbWFsbCB7IGRpc3BsYXk6IGJsb2NrOyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTFweDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4OyB9DQoueHRpdGxlIHsgZ3JpZC1jb2x1bW46IDI7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMTBweDsgfQ0KLmdsYWIgeyBkaXNwbGF5OiBub25lOyB9DQoNCkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSkgew0KICAucmV2ZWFsIC5iYXIgeyB0cmFuc2Zvcm06IHNjYWxlWSgwKTsgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGJvdHRvbTsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuNnMgY3ViaWMtYmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksIG9wYWNpdHkgMC4ycyBlYXNlOyB0cmFuc2l0aW9uLWRlbGF5OiBjYWxjKHZhcigtLWksIDApICogNDBtcyk7IH0NCiAgLnJldmVhbC5pbiAuYmFyIHsgdHJhbnNmb3JtOiBub25lOyB9DQogIC5yZXZlYWwgLmJhciAubGFiIHsgb3BhY2l0eTogMDsgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjRzIGVhc2U7IHRyYW5zaXRpb24tZGVsYXk6IGNhbGModmFyKC0taSwgMCkgKiA0MG1zICsgMzAwbXMpOyB9DQogIC5yZXZlYWwuaW4gLmJhciAubGFiIHsgb3BhY2l0eTogMTsgfQ0KICAucmV2ZWFsIC5hbm5vIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDRweCk7IHRyYW5zaXRpb246IG9wYWNpdHkgMC40cyBlYXNlIDAuNXMsIHRyYW5zZm9ybSAwLjRzIGVhc2UgMC41czsgfQ0KICAucmV2ZWFsLmluIC5hbm5vIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lOyB9DQogIC5yZXZlYWwuaW4uc2V0dGxlZCAuYmFyLCAucmV2ZWFsLmluLnNldHRsZWQgLmJhciAubGFiIHsgdHJhbnNpdGlvbi1kZWxheTogMHM7IH0NCn0NCg0KQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7DQogIC5mbGlwIC5wbG90IHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7IH0NCiAgLmZsaXAgLmFyZWEgeyBncmlkLWNvbHVtbjogMTsgaGVpZ2h0OiBhdXRvOyBtYXJnaW4tYm90dG9tOiAyNnB4OyB9DQogIC5mbGlwIC55bGluZXMgeyBpbnNldDogMCB2YXIoLS1oZywgNTZweCkgMCAwOyB9DQogIC5mbGlwIC55bCB7IGxlZnQ6IHZhcigtLXApOyByaWdodDogYXV0bzsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiAxcHg7IGhlaWdodDogYXV0bzsgfQ0KICAuZmxpcCAueWwgaSB7IHJpZ2h0OiBhdXRvOyBsZWZ0OiA1MCU7IHRvcDogY2FsYygxMDAlICsgNnB4KTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOyB9DQogIC5mbGlwIC5ncm91cHMgeyBwb3NpdGlvbjogc3RhdGljOyBkaXNwbGF5OiBibG9jazsgcGFkZGluZy1yaWdodDogdmFyKC0taGcsIDU2cHgpOyB9DQogIC5mbGlwIC5ncm91cCB7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAwIDAgMThweDsgfQ0KICAuZmxpcCAuZ3JvdXA6bGFzdC1jaGlsZCB7IHBhZGRpbmctYm90dG9tOiAwOyB9DQogIC5mbGlwIC5hbm5vIHsgcG9zaXRpb246IHN0YXRpYzsgdGV4dC1hbGlnbjogbGVmdDsgbWFyZ2luOiAycHggMCA2cHg7IH0NCiAgLmZsaXAgLmFubm8gc21hbGwgeyBkaXNwbGF5OiBpbmxpbmU7IG1hcmdpbi1sZWZ0OiA2cHg7IH0NCiAgLmZsaXAgLmJhcnMgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDRweDsgfQ0KICAuZmxpcCAuYmFyIHsgZmxleDogbm9uZTsgd2lkdGg6IHZhcigtLXYpOyBoZWlnaHQ6IDE2cHg7IG1pbi13aWR0aDogMnB4OyB9DQogIC5mbGlwIC5iYXIgLmxhYiB7IGJvdHRvbTogYXV0bzsgbGVmdDogMTAwJTsgdG9wOiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsgbWFyZ2luOiAwIDAgMCA2cHg7IH0NCiAgLmZsaXAgLnhsYWJlbHMgeyBkaXNwbGF5OiBub25lOyB9DQogIC5mbGlwIC5nbGFiIHsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogMCAwIDZweDsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNTAwOyB9DQogIC5mbGlwIC5nbGFiIHNtYWxsIHsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7IH0NCiAgLmZsaXAgLmJhcnMgeyBtYXJnaW4tdG9wOiAycHg7IH0NCiAgQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7DQogICAgLnJldmVhbC5mbGlwIC5iYXIgeyB0cmFuc2Zvcm06IHNjYWxlWCgwKTsgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7IH0NCiAgICAucmV2ZWFsLmZsaXAuaW4gLmJhciB7IHRyYW5zZm9ybTogbm9uZTsgfQ0KICB9DQp9DQoNCi5wbG90IHsgLS1oOiAzMDBweDsgfSAucGxvdCwgLnhsYWJlbHMgeyAtLXl3OiA0OHB4OyB9DQouZ3JvdXAgeyBwYWRkaW5nOiAwIDQlOyBnYXA6IDVweDsgfQ0KLmJhciB7IC0tYnc6IDU0cHg7IH0NCkBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCkgeyAucGxvdCB7IC0taDogMjYwcHg7IH0gLmFubm8gc21hbGwgeyBkaXNwbGF5OiBub25lOyB9IC5iYXIgLmxhYiB7IGZvbnQtc2l6ZTogMTFweDsgfSB9DQpAbWVkaWEgKG1heC13aWR0aDogNzAwcHgpIHsgLnhsIHsgZm9udC1zaXplOiAxMi41cHg7IH0gLmFubm8geyBmb250LXNpemU6IDExcHg7IH0gfQ0KQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7IC5hbm5vIHNtYWxsIHsgZGlzcGxheTogaW5saW5lOyB9IH0NCjwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxkaXYgY2xhc3M9IndyYXAiIGlkPSJyb290Ij4NCiAgPGhlYWRlciBjbGFzcz0iaGVhZCI+DQogICAgPHNwYW4gY2xhc3M9ImJhZGdlIj5Db3N0PC9zcGFuPg0KICAgIDxoMT5Db3N0IHBlciBydW48L2gxPg0KICAgIDxwIGNsYXNzPSJzdWIiPk1pY3Jvc29mdC1EZWNpc2lvbi0xIGNsYXNzaWZpZXMgdGhlIHNhbWUgdGV4dHMgZm9yIGEgc21hbGwgZnJhY3Rpb24gb2YgdGhlIGNvc3Qgb2YgR1BULTYgU29sLjwvcD4NCiAgPC9oZWFkZXI+DQoNCiAgPGRpdiBjbGFzcz0iY29udHJvbHMiPg0KICAgIDxkaXYgY2xhc3M9ImsiPkNvc3QgdG8gY2xhc3NpZnkgdGhlIHdob2xlIGRhdGFzZXQgb25jZSDCtyBsb2cgc2NhbGUgKFVTRCk8L2Rpdj4NCiAgICA8ZGl2IGNsYXNzPSJsZWdlbmQiIGlkPSJsZWdlbmQiIHJvbGU9Imdyb3VwIiBhcmlhLWxhYmVsPSJIaWdobGlnaHQgYSBtb2RlbCI+PC9kaXY+DQogIDwvZGl2Pg0KICA8ZGl2IGNsYXNzPSJyZXZlYWwgZmxpcCIgaWQ9ImNoYXJ0Ij4NCiAgICA8ZGl2IGNsYXNzPSJwbG90IiBpZD0icGxvdCI+DQogICAgICA8ZGl2IGNsYXNzPSJhcmVhIj4NCiAgICAgICAgPGRpdiBjbGFzcz0ieWxpbmVzIiBpZD0ieWxpbmVzIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9Imdyb3VwcyIgaWQ9Imdyb3VwcyI+PC9kaXY+DQogICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8ZGl2IGNsYXNzPSJ4bGFiZWxzIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PGRpdj48L2Rpdj48ZGl2IGNsYXNzPSJ4cm93IiBpZD0ieHJvdyI+PC9kaXY+PC9kaXY+DQogIDwvZGl2Pg0KICA8cCBjbGFzcz0ibm90ZSI+QmFycyBhcmUgb24gYSBsb2cgc2NhbGUsIHNvIGVhY2ggZ3JpZGxpbmUgaXMgYSB0ZW5mb2xkIGNoYW5nZSBpbiBjb3N0LjwvcD4NCiAgPGRpdiBjbGFzcz0ic291cmNlIj4NCiAgICA8cD5Fc3RpbWF0ZWQuIEJvdGggcmVhZCB0aGUgaWRlbnRpY2FsIGJyaWVmLCBzbyBpbnB1dCB0b2tlbnMgbWF0Y2g7IG9ubHkgR1BULTYgU29sIGFsc28gcGF5cyBmb3Igb3V0cHV0LjwvcD4NCiAgICA8cD5TY2FsZWQgdG8gMSwwMDAsMDAwIHRleHRzOiBHUFQtNiBTb2wgYWJvdXQgPHNwYW4gY2xhc3M9Im51bSI+JDIsNDM0PC9zcGFuPiwgTWljcm9zb2Z0LURlY2lzaW9uLTEgYWJvdXQgPHNwYW4gY2xhc3M9Im51bSI+JDExPC9zcGFuPi48L3A+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InRpcCIgaWQ9InRpcCIgcm9sZT0idG9vbHRpcCIgYXJpYS1oaWRkZW49InRydWUiPjwvZGl2Pg0KPC9kaXY+DQo8c2NyaXB0Pg0KKGZ1bmN0aW9uICgpIHsNCiAgdmFyIG1vdGlvbiA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSknKS5tYXRjaGVzOw0KICB2YXIgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290Jyk7DQogIHZhciB0aXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGlwJyk7DQoNCiAgZnVuY3Rpb24gZWwodGFnLCBjbHMsIHRleHQpIHsNCiAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsNCiAgICBpZiAoY2xzKSBuLmNsYXNzTmFtZSA9IGNsczsNCiAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkICYmIHRleHQgIT09IG51bGwpIG4udGV4dENvbnRlbnQgPSB0ZXh0Ow0KICAgIHJldHVybiBuOw0KICB9DQogIGZ1bmN0aW9uIHNldFZhcihuLCBrLCB2KSB7IG4uc3R5bGUuc2V0UHJvcGVydHkoaywgdik7IH0NCiAgZnVuY3Rpb24gZm10TihuLCBkKSB7IHJldHVybiBuLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBkLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGQgfSk7IH0NCg0KICAvLyAtLS0tIFRvb2x0aXAgKGhvdmVyLCBrZXlib2FyZCBmb2N1cyBhbmQgdGFwKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgdmFyIGhvdCA9IG51bGw7DQogIGZ1bmN0aW9uIHJlbmRlclRpcChzcGVjKSB7DQogICAgdGlwLmlubmVySFRNTCA9ICcnOw0KICAgIGlmIChzcGVjLnRpdGxlKSB0aXAuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICd0Jywgc3BlYy50aXRsZSkpOw0KICAgIChzcGVjLnJvd3MgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHIpIHsNCiAgICAgIHZhciByb3cgPSBlbCgnZGl2JywgJ3InICsgKHJbMl0gPyAnICcgKyByWzJdIDogJycpKTsNCiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsIG51bGwsIHJbMF0pKTsNCiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdudW0nLCByWzFdKSk7DQogICAgICB0aXAuYXBwZW5kQ2hpbGQocm93KTsNCiAgICB9KTsNCiAgICBpZiAoc3BlYy5ub3RlKSB0aXAuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdzJywgc3BlYy5ub3RlKSk7DQogIH0NCiAgZnVuY3Rpb24gcGxhY2VUaXAobm9kZSwgcHJlZmVyKSB7DQogICAgdmFyIHJyID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCiAgICB2YXIgbnIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KICAgIHZhciB0dyA9IHRpcC5vZmZzZXRXaWR0aCwgdGggPSB0aXAub2Zmc2V0SGVpZ2h0Ow0KICAgIHZhciBsZWZ0ID0gbnIubGVmdCAtIHJyLmxlZnQgKyAocHJlZmVyID09PSAnYWJvdmUnID8gbnIud2lkdGggLyAyIC0gdHcgLyAyIDogMCk7DQogICAgbGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxlZnQsIHJyLndpZHRoIC0gdHcpKTsNCiAgICB2YXIgYmVsb3cgPSBuci5ib3R0b20gLSByci50b3AgKyA2Ow0KICAgIHZhciBhYm92ZSA9IG5yLnRvcCAtIHJyLnRvcCAtIHRoIC0gKHByZWZlciA9PT0gJ2Fib3ZlJyA/IDI2IDogNik7DQogICAgdmFyIHRvcDsNCiAgICBpZiAocHJlZmVyID09PSAnYWJvdmUnKSB0b3AgPSBhYm92ZSA+PSAwID8gYWJvdmUgOiBNYXRoLm1pbihiZWxvdywgcnIuaGVpZ2h0IC0gdGgpOw0KICAgIGVsc2UgdG9wID0gKGJlbG93ICsgdGggPD0gcnIuaGVpZ2h0KSA/IGJlbG93IDogTWF0aC5tYXgoMCwgYWJvdmUpOw0KICAgIC8vIFN0YXkgaW5zaWRlIHRoZSB3aWRnZXQgc28gdGhlIGF1dG8tc2l6ZWQgZnJhbWUgbmV2ZXIgY2xpcHMgdGhlIHRpcC4NCiAgICB0aXAuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnOw0KICAgIHRpcC5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCB0b3ApICsgJ3B4JzsNCiAgfQ0KICBmdW5jdGlvbiBzaG93VGlwKG5vZGUsIGJ1aWxkLCBwcmVmZXIpIHsNCiAgICBpZiAoaG90ID09PSBub2RlKSByZXR1cm47DQogICAgaGlkZVRpcCgpOw0KICAgIGhvdCA9IG5vZGU7DQogICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdob3QnKTsNCiAgICByZW5kZXJUaXAoYnVpbGQobm9kZSkpOw0KICAgIHRpcC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7DQogICAgdGlwLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTsNCiAgICBwbGFjZVRpcChub2RlLCBwcmVmZXIpOw0KICB9DQogIGZ1bmN0aW9uIGhpZGVUaXAoKSB7DQogICAgaWYgKGhvdCkgaG90LmNsYXNzTGlzdC5yZW1vdmUoJ2hvdCcpOw0KICAgIGhvdCA9IG51bGw7DQogICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsNCiAgICB0aXAuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7DQogIH0NCiAgZnVuY3Rpb24gYmluZFRpcHMoc2VsZWN0b3IsIGJ1aWxkLCBwcmVmZXIpIHsNCiAgICBmdW5jdGlvbiBmaW5kKHQpIHsNCiAgICAgIHZhciBuID0gdDsNCiAgICAgIHdoaWxlIChuICYmIG4gIT09IHJvb3QpIHsNCiAgICAgICAgaWYgKG4ubWF0Y2hlcyAmJiBuLm1hdGNoZXMoc2VsZWN0b3IpKSByZXR1cm4gbjsNCiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuKSBzaG93VGlwKG4sIGJ1aWxkLCBwcmVmZXIpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24gKGUpIHsgdmFyIG4gPSBmaW5kKGUudGFyZ2V0KTsgaWYgKG4gJiYgIW4uY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSkgaGlkZVRpcCgpOyB9KTsNCiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBmdW5jdGlvbiAoZSkgeyB2YXIgbiA9IGZpbmQoZS50YXJnZXQpOyBpZiAobikgc2hvd1RpcChuLCBidWlsZCwgcHJlZmVyKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGZ1bmN0aW9uIChlKSB7IHZhciBuID0gZmluZChlLnRhcmdldCk7IGlmIChuICYmICFuLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCkpIGhpZGVUaXAoKTsgfSk7DQogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgaGlkZVRpcCgpOyB9KTsNCiAgfQ0KDQogIC8vIC0tLS0gQ291bnQtdXAgKHZpc2liaWxpdHktdHJpZ2dlcmVkIHZpYSByZXZlYWwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgdmFyIEVBU0UgPSBmdW5jdGlvbiAodCkgeyByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCAzKTsgfTsNCiAgZnVuY3Rpb24gY291bnRVcChub2RlLCB0bywgZm10LCBtcywgZGVsYXkpIHsNCiAgICBpZiAoIW1vdGlvbikgeyBub2RlLnRleHRDb250ZW50ID0gZm10KHRvKTsgcmV0dXJuOyB9DQogICAgdmFyIHN0YXJ0ID0gbnVsbDsNCiAgICBub2RlLnRleHRDb250ZW50ID0gZm10KDApOw0KICAgIGZ1bmN0aW9uIGZyYW1lKG5vdykgew0KICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKSBzdGFydCA9IG5vdyArIChkZWxheSB8fCAwKTsNCiAgICAgIHZhciB0ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgKG5vdyAtIHN0YXJ0KSAvIG1zKSk7DQogICAgICBub2RlLnRleHRDb250ZW50ID0gZm10KHRvICogRUFTRSh0KSk7DQogICAgICBpZiAodCA8IDEpIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7DQogICAgfQ0KICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZSk7DQogIH0NCg0KICAvLyAtLS0tIFJldmVhbCAoSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgb25seTsgbm8gdGltZXJzIHN0YXJ0IGFueXRoaW5nKSAtLS0tLS0NCiAgLy8gYHNldHRsZWRgIHJlbW92ZXMgc3RhZ2dlciBkZWxheXMgb25jZSB0aGUgZW50cmFuY2UgaGFzIHBsYXllZCBzbyBob3ZlciwNCiAgLy8gdG9nZ2xlcyBhbmQgZmlsdGVycyByZXNwb25kIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuDQogIGZ1bmN0aW9uIHJldmVhbChncm91cCwgY291bnQsIGNiKSB7DQogICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCgnaW4nKTsNCiAgICBpZiAoY2IpIGNiKCk7DQogICAgaWYgKCFtb3Rpb24pIHsgZ3JvdXAuY2xhc3NMaXN0LmFkZCgnc2V0dGxlZCcpOyByZXR1cm47IH0NCiAgICB2YXIgd2FpdCA9IE1hdGgubWluKGNvdW50LCAzMCkgKiA0NSArIDcwMDsNCiAgICB2YXIgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTsNCiAgICAoZnVuY3Rpb24gdGljayhub3cpIHsgaWYgKG5vdyAtIHQwID49IHdhaXQpIGdyb3VwLmNsYXNzTGlzdC5hZGQoJ3NldHRsZWQnKTsgZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7IH0pKHQwKTsNCiAgfQ0KICBmdW5jdGlvbiBvYnNlcnZlKGl0ZW1zKSB7IC8vIGl0ZW1zOiBbW25vZGUsIGZuXV0NCiAgICBpZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsNCiAgICAgIHZhciBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykgew0KICAgICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsNCiAgICAgICAgICBpZiAoIWUuaXNJbnRlcnNlY3RpbmcpIHJldHVybjsNCiAgICAgICAgICBpby51bm9ic2VydmUoZS50YXJnZXQpOw0KICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0KSB7IGlmIChpdFswXSA9PT0gZS50YXJnZXQpIGl0WzFdKCk7IH0pOw0KICAgICAgICB9KTsNCiAgICAgIH0sIHsgdGhyZXNob2xkOiAwLjA1IH0pOw0KICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXQpIHsgaW8ub2JzZXJ2ZShpdFswXSk7IH0pOw0KICAgIH0gZWxzZSB7DQogICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyBpdFsxXSgpOyB9KTsNCiAgICB9DQogIH0NCiAgdmFyIGhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZCcpOw0KDQogIHZhciBEQVRBID0gew0KICAgIHNlcmllczogWw0KICAgICAgWydHUFQtNiBTb2wnLCAncmVmJ10sDQogICAgICBbJ01pY3Jvc29mdC1EZWNpc2lvbi0xJywgJ3ByaSddDQogICAgXSwNCiAgICBncm91cHM6IFsNCiAgICAgIC8vIGRhdGFzZXQsIHVuaXQsIFtHUFQtNiBTb2wsIE1EMV0gVVNELCAiY2hlYXBlciIgYW5ub3RhdGlvbg0KICAgICAgWydSYWNpbmcgVGl0bGUnLCAnNzUzIHJldmlld3MnLCBbMS44MywgMC4wMDldLCAnMjEzJ10sDQogICAgICBbJ0ZpcnN0LVBlcnNvbiBTaG9vdGVyJywgJzM0MSByZXZpZXdzJywgWzEuMDMsIDAuMDA1XSwgJzIxMiddLA0KICAgICAgWydTdHVkaW8gTGl2ZXN0cmVhbScsICcxMDMwIHBvc3RzJywgWzIuOTIsIDAuMDEzXSwgJzIyMyddDQogICAgXSwNCiAgICBkb21haW46IFswLjAwMywgMjBdLA0KICAgIHRpY2tzOiBbWzAuMDEsICckMC4wMSddLCBbMC4xLCAnJDAuMTAnXSwgWzEsICckMSddLCBbMTAsICckMTAnXV0NCiAgfTsNCiAgZnVuY3Rpb24gdXNkKHYpIHsNCiAgICBpZiAodiA8IDAuMSkgcmV0dXJuIGZtdE4odiAqIDEwMCwgMSkgKyAnwqInOw0KICAgIHJldHVybiAnJCcgKyBmbXROKHYsIDIpOw0KICB9DQogIGZ1bmN0aW9uIHBjdCh2KSB7DQogICAgdmFyIGxvID0gTWF0aC5sb2coREFUQS5kb21haW5bMF0pLCBoaSA9IE1hdGgubG9nKERBVEEuZG9tYWluWzFdKTsNCiAgICByZXR1cm4gTWF0aC5tYXgoMCwgKE1hdGgubG9nKE1hdGgubWF4KHYsIERBVEEuZG9tYWluWzBdKSkgLSBsbykgLyAoaGkgLSBsbykgKiAxMDApOw0KICB9DQoNCiAgdmFyIHlsaW5lcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd5bGluZXMnKTsNCiAgdmFyIGdyb3VwcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncm91cHMnKTsNCiAgdmFyIHhyb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneHJvdycpOw0KICB2YXIgY291bnRlcnMgPSBbXTsNCiAgdmFyIGsgPSAwOw0KDQogIERBVEEudGlja3MuZm9yRWFjaChmdW5jdGlvbiAodCwgaSkgew0KICAgIHZhciB5ID0gZWwoJ3NwYW4nLCAneWwnICsgKGkgPT09IDAgPyAnJyA6ICcnKSk7DQogICAgc2V0VmFyKHksICctLXAnLCBwY3QodFswXSkgKyAnJScpOw0KICAgIHkuYXBwZW5kQ2hpbGQoZWwoJ2knLCBudWxsLCB0WzFdKSk7DQogICAgeWxpbmVzLmFwcGVuZENoaWxkKHkpOw0KICB9KTsNCiAgdmFyIGJhc2UgPSBlbCgnc3BhbicsICd5bCBiYXNlJyk7IHNldFZhcihiYXNlLCAnLS1wJywgJzAlJyk7IHlsaW5lcy5hcHBlbmRDaGlsZChiYXNlKTsNCg0KICBEQVRBLmdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uIChnLCBnaSkgew0KICAgIHZhciBncm91cCA9IGVsKCdkaXYnLCAnZ3JvdXAnKTsNCiAgICB2YXIgZ2xhYiA9IGVsKCdkaXYnLCAnZ2xhYicsIGdbMF0pOyBnbGFiLmFwcGVuZENoaWxkKGVsKCdzbWFsbCcsIG51bGwsIGdbMV0pKTsNCiAgICBncm91cC5hcHBlbmRDaGlsZChnbGFiKTsNCiAgICB2YXIgYW5ubyA9IGVsKCdkaXYnLCAnYW5ubycsICd+JyArIGdbM10gKyAnw5cgY2hlYXBlcicpOw0KICAgIGFubm8uYXBwZW5kQ2hpbGQoZWwoJ3NtYWxsJywgbnVsbCwgJ01pY3Jvc29mdC1EZWNpc2lvbi0xIHZzIEdQVC02IFNvbCcpKTsNCiAgICBncm91cC5hcHBlbmRDaGlsZChhbm5vKTsNCiAgICB2YXIgYmFycyA9IGVsKCdkaXYnLCAnYmFycycpOw0KICAgIERBVEEuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24gKHMsIHNpKSB7DQogICAgICB2YXIgdiA9IGdbMl1bc2ldOw0KICAgICAgdmFyIGJhciA9IGVsKCdidXR0b24nLCAnYmFyICcgKyBzWzFdICsgJyBzJyArIHNpKTsNCiAgICAgIGJhci50eXBlID0gJ2J1dHRvbic7DQogICAgICBzZXRWYXIoYmFyLCAnLS12JywgcGN0KHYpICsgJyUnKTsNCiAgICAgIHNldFZhcihiYXIsICctLWknLCBTdHJpbmcoaysrKSk7DQogICAgICBiYXIuZGF0YXNldC5nID0gU3RyaW5nKGdpKTsgYmFyLmRhdGFzZXQucyA9IFN0cmluZyhzaSk7DQogICAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc1swXSArICcsICcgKyBnWzBdICsgJzogJyArIHVzZCh2KSArICcgcGVyIHJ1bicpOw0KICAgICAgdmFyIGxhYiA9IGVsKCdzcGFuJywgJ2xhYicsIHVzZCh2KSk7DQogICAgICBjb3VudGVycy5wdXNoKFtsYWIsIHZdKTsNCiAgICAgIGJhci5hcHBlbmRDaGlsZChsYWIpOw0KICAgICAgYmFycy5hcHBlbmRDaGlsZChiYXIpOw0KICAgIH0pOw0KICAgIGdyb3VwLmFwcGVuZENoaWxkKGJhcnMpOw0KICAgIGdyb3Vwcy5hcHBlbmRDaGlsZChncm91cCk7DQogICAgdmFyIHhsID0gZWwoJ2RpdicsICd4bCcsIGdbMF0pOyB4bC5hcHBlbmRDaGlsZChlbCgnc21hbGwnLCBudWxsLCBnWzFdKSk7DQogICAgeHJvdy5hcHBlbmRDaGlsZCh4bCk7DQogIH0pOw0KDQogIC8vIExlZ2VuZDogaXNvbGF0ZSBhIHNlcmllcw0KICB2YXIgbGVnZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlZ2VuZCcpOw0KICB2YXIgcGxvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbG90Jyk7DQogIERBVEEuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24gKHMsIHNpKSB7DQogICAgdmFyIGIgPSBlbCgnYnV0dG9uJywgbnVsbCk7IGIudHlwZSA9ICdidXR0b24nOw0KICAgIGIuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTsgYi5kYXRhc2V0LnMgPSBTdHJpbmcoc2kpOw0KICAgIGIuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAnc3cgJyArIHNbMV0pKTsgYi5hcHBlbmRDaGlsZChlbCgnc3BhbicsIG51bGwsIHNbMF0pKTsNCiAgICBsZWdlbmQuYXBwZW5kQ2hpbGQoYik7DQogIH0pOw0KICB2YXIgaXNvID0gbnVsbDsNCiAgbGVnZW5kLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHsNCiAgICB2YXIgYiA9IGUudGFyZ2V0LmNsb3Nlc3QoJ2J1dHRvbicpOyBpZiAoIWIpIHJldHVybjsNCiAgICBpc28gPSBpc28gPT09IGIuZGF0YXNldC5zID8gbnVsbCA6IGIuZGF0YXNldC5zOw0KICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobGVnZW5kLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLCBmdW5jdGlvbiAoeCkgeyB4LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgeC5kYXRhc2V0LnMgPT09IGlzbyA/ICd0cnVlJyA6ICdmYWxzZScpOyB9KTsNCiAgICBsZWdlbmQuY2xhc3NMaXN0LnRvZ2dsZSgnaXNvJywgaXNvICE9PSBudWxsKTsNCiAgICBwbG90LmNsYXNzTGlzdC50b2dnbGUoJ2lzbycsIGlzbyAhPT0gbnVsbCk7DQogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChwbG90LnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYXInKSwgZnVuY3Rpb24gKGJhcikgeyBiYXIuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCBiYXIuZGF0YXNldC5zID09PSBpc28pOyB9KTsNCiAgfSk7DQoNCiAgYmluZFRpcHMoJy5iYXInLCBmdW5jdGlvbiAoYmFyKSB7DQogICAgdmFyIGcgPSBEQVRBLmdyb3Vwc1srYmFyLmRhdGFzZXQuZ10sIHNpID0gK2Jhci5kYXRhc2V0LnMsIHMgPSBEQVRBLnNlcmllc1tzaV07DQogICAgdmFyIHNwZWMgPSB7IHRpdGxlOiBzWzBdICsgJyDCtyAnICsgZ1swXSwgcm93czogW1snQ29zdCBwZXIgZnVsbCBydW4nLCB1c2QoZ1syXVtzaV0pLCBzWzFdID09PSAncHJpJyA/ICdoaScgOiAnJ10sIFsnRGF0YXNldCcsIGdbMV1dXSB9Ow0KICAgIHNwZWMubm90ZSA9IHNpID09PSAxID8gJ34nICsgZ1szXSArICfDlyBjaGVhcGVyIHRoYW4gR1BULTYgU29sIG9uIHRoaXMgZGF0YXNldC4gRXN0aW1hdGVkLicNCiAgICAgIDogJ0VzdGltYXRlZCBjb3N0IHRvIGNsYXNzaWZ5IHRoZSB3aG9sZSBkYXRhc2V0IG9uY2UuJzsNCiAgICByZXR1cm4gc3BlYzsNCiAgfSwgJ2Fib3ZlJyk7DQoNCiAgdmFyIGNoYXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXJ0Jyk7DQogIG9ic2VydmUoWw0KICAgIFtoZWFkLCBmdW5jdGlvbiAoKSB7IGhlYWQuY2xhc3NMaXN0LmFkZCgnaW4nKTsgfV0sDQogICAgW2NoYXJ0LCBmdW5jdGlvbiAoKSB7DQogICAgICByZXZlYWwoY2hhcnQsIGNvdW50ZXJzLmxlbmd0aCwgZnVuY3Rpb24gKCkgew0KICAgICAgICBjb3VudGVycy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IGNvdW50VXAoY1swXSwgY1sxXSwgdXNkLCA4MDAsIDI1MCk7IH0pOw0KICAgICAgfSk7DQogICAgfV0NCiAgXSk7DQoNCn0pKCk7DQo8L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4NCg==

Quality control

The Copilot team measures the quality of chat and agentic responses. Their testing found Microsoft-Decision-1 to be competitive with GPT5.6 Luna and 100 times faster.

Incident response

Our on-call engineers use AI to retrieve relevant knowledge to respond to live incidents across logs, ticketing systems, calls, messages, and other data sources. Microsoft-Decision-1 performed better and faster than an LLM for knowledge retrieval.

Scientific discovery

Microsoft Discovery implements an adaptive replanning feature where an agent evaluates a previous experiment, revises its approach based on rubric grades, and repeats until it has completed its objectives. Microsoft-Decision-1 scored as 46 times more consistent than the LLM-based score at three times the speed and resulted in nearly four times the speed on adaptive replanning

Video 3 Faster, more reliable planning could significantly impact outcomes for long-running scientific experiments.

Those are just a small handful of examples. There are many more potential use cases for Microsoft-Decision-1. Consider trying out the following:

  • Agent controls: Evaluate an agent’s proposed next step and decide whether to continue, stop, retry, or hand off to a model, tool, or human.
  • Model routing: Evaluate an incoming request and select the best model for the task based on quality, cost, and latency requirements.
  • Skill-based decisions: Apply the rules from an agent skill to select the appropriate next action without repeatedly processing a long list of instructions.
  • Data labeling: Assign consistent labels to social media posts, customer feedback, and other data for analysis or training.
  • AI judging: Evaluate an AI-generated response against defined quality criteria and decide whether to accept, revise, or reject it.
  • Intent analysis: Identify what a user is trying to accomplish and match their request to a supported intent.
  • Incident response routing: Classify an incident by type and urgency, then route it to the appropriate team or workflow.
  • Data validation: Check whether an input meets defined requirements and decide whether to accept it, reject it, or flag it for review.
  • Recommendations: Select the most relevant item, offer, or next action from a set of candidates.
  • Search relevance: Assess how well a search result matches a query and assign a relevance label or priority.
  • Content classification and filtering: Categorize content by topic or policy and decide whether to display it, filter it, or send it for review.
  • Code scanning: Evaluate code against defined criteria and flag potential defects or policy violations for review.
  • Safety and security screening: Classify requests, outputs, or proposed actions by risk and decide whether to allow, block, or escalate them.
  • Computer and UI use: Select the next interface action from a set of options based on the current screen and task.
  • Robotics: Select among predefined robot actions based on observations, task goals, and operating constraints.
  • Scientific discovery: Screen candidate hypotheses, compounds, or experiments against defined criteria and prioritize them for further evaluation.

Getting started

Developers can get started with Microsoft-Decision-1 today in Microsoft Foundry here: https://ai.azure.com/catalog/models/Microsoft-Decision-1.

Pricing

Input tokens cost $0.042 USD per million tokens. Output tokens are free.

Looking ahead

Now that agentic AI is a reality, we’ve seen that cost plays a major role in how people decide to use AI. And it’s increasingly important to choose the right model for the right job. With agents taking action and making an impact in the real world, decision models have the potential to help people guide and control those agents through complex environments.

We look forward to seeing what developers build with Microsoft-Decision-1 and hearing their feedback. We’ll continue to release updates to the model, including by incorporating evaluations and data to further optimize quality, confidence, and cost.

Appendix: Models benchmarked

Quyet-1.0-Large — https://huggingface.co/chinhnc/Quyet-1.0-Large
Surogate Rune 26B-A4B — https://huggingface.co/surogate/rune-26b-a4b-GGUF
GPT-6 Luna Decisions — https://developers.openai.com/api/docs/guides/decisions
deck-31B — https://github.com/krishna-gogineni-765/deck31b
H2O-Lightning-4B — https://huggingface.co/h2oai/h2o-lightning-4b
Strands-Decider 2B — https://github.com/strands-labs/strands-decider

Share

inrxf

Introducing Microsoft-Decision-1, our model for fast decision-making

Next Stop

Bringing local models and sandboxed tools to Windows and GitHub Copilot Deep Dive Coming soon, GitHub Copilot will determine when a task is best handled by on-device intelligence and when it should leverage cloud-scale models. [ read ]October 7, 2026### Beyond violation rates: Are your AI evaluations measuring the right things? Deep Dive Structured evaluation design can improve both the breadth of behaviors tested and the interpretability of the resulting failures, leading to practical advantages for generating diverse, traceable, and actionable evaluations. [ read ]October 5, 2026

Image 4

Follow the systems work as it breaks and gets rebuilt. Subscribe for updates

© 2026 A Microsoft publication

English (United States)Your Privacy ChoicesConsumer Health Privacy

SitemapContact MicrosoftPrivacyTerms of useTrademarksSafety & ecoRecyclingAbout our adsManage cookiesRSS

What's new

Microsoft Store

Education

Business

Developer & IT

Company

English (United States)

Your Privacy Choices

Consumer Health Privacy

Image 5

来源:Hacker News · commandline.microsoft.com