ZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvX19pbml0X18ucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODc0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNTU1IEBACisiIiJ0dExpYiAtLSBhIHBhY2thZ2UgZm9yIGRlYWxpbmcgd2l0aCBUcnVlVHlwZSBmb250cy4KKworVGhpcyBwYWNrYWdlIG9mZmVycyB0cmFuc2xhdG9ycyB0byBjb252ZXJ0IFRydWVUeXBlIGZvbnRzIHRvIFB5dGhvbiAKK29iamVjdHMgYW5kIHZpY2UgdmVyc2EsIGFuZCBhZGRpdGlvbmFsbHkgZnJvbSBQeXRob24gdG8gWE1MIGFuZCB2aWNlIHZlcnNhLgorCitFeGFtcGxlIGludGVyYWN0aXZlIHNlc3Npb246CisKK1B5dGhvbiAxLjUuMmMxICgjNDMsIE1hciAgOSAxOTk5LCAxMzowNjo0MykgIFtDVyBQUEMgdy9HVVNJIHcvTVNMXQorQ29weXJpZ2h0IDE5OTEtMTk5NSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sIEFtc3RlcmRhbQorPj4+IGZyb20gZm9udFRvb2xzIGltcG9ydCB0dExpYgorPj4+IHR0ID0gdHRMaWIuVFRGb250KCJhZm9udC50dGYiKQorPj4+IHR0WydtYXhwJ10ubnVtR2x5cGhzCisyNDIKKz4+PiB0dFsnT1MvMiddLmFjaFZlbmRJRAorJ0ImSFwwMDAnCis+Pj4gdHRbJ2hlYWQnXS51bml0c1BlckVtCisyMDQ4Cis+Pj4gdHQuc2F2ZVhNTCgiYWZvbnQueG1sIikKK0R1bXBpbmcgJ0xUU0gnIHRhYmxlLi4uCitEdW1waW5nICdPUy8yJyB0YWJsZS4uLgorRHVtcGluZyAnVkRNWCcgdGFibGUuLi4KK0R1bXBpbmcgJ2NtYXAnIHRhYmxlLi4uCitEdW1waW5nICdjdnQgJyB0YWJsZS4uLgorRHVtcGluZyAnZnBnbScgdGFibGUuLi4KK0R1bXBpbmcgJ2dseWYnIHRhYmxlLi4uCitEdW1waW5nICdoZG14JyB0YWJsZS4uLgorRHVtcGluZyAnaGVhZCcgdGFibGUuLi4KK0R1bXBpbmcgJ2hoZWEnIHRhYmxlLi4uCitEdW1waW5nICdobXR4JyB0YWJsZS4uLgorRHVtcGluZyAnbG9jYScgdGFibGUuLi4KK0R1bXBpbmcgJ21heHAnIHRhYmxlLi4uCitEdW1waW5nICduYW1lJyB0YWJsZS4uLgorRHVtcGluZyAncG9zdCcgdGFibGUuLi4KK0R1bXBpbmcgJ3ByZXAnIHRhYmxlLi4uCis+Pj4gdHQyID0gdHRMaWIuVFRGb250KCkKKz4+PiB0dDIuaW1wb3J0WE1MKCJhZm9udC54bWwiKQorPj4+IHR0MlsnbWF4cCddLm51bUdseXBocworMjQyCis+Pj4gCisKKyIiIgorCitfX2F1dGhvcl9fID0gIkp1c3QgdmFuIFJvc3N1bSwganVzdEBsZXR0ZXJyb3IuY29tIgorX192ZXJzaW9uX18gPSAiMS4wYTUiCisKKworaW1wb3J0IG9zCitpbXBvcnQgc3RhdAoraW1wb3J0IHR5cGVzCisKK2NsYXNzIFRUTGliRXJyb3IoRXhjZXB0aW9uKTogcGFzcworCisKK2NsYXNzIFRURm9udDoKKwkKKwkiIiJUaGUgbWFpbiBmb250IG9iamVjdC4gSXQgbWFuYWdlcyBmaWxlIGlucHV0IGFuZCBvdXRwdXQsIGFuZCBvZmZlcnMKKwlhIGNvbnZlbmllbnQgd2F5IG9mIGFjY2Vzc2luZyB0YWJsZXMuIAorCVRhYmxlcyB3aWxsIGJlIG9ubHkgZGVjb21waWxlZCB3aGVuIG5lY2Nlc2FyeSwgaWUuIHdoZW4gdGhleSdyZSBhY3R1YWxseQorCWFjY2Vzc2VkLiBUaGlzIG1lYW5zIHRoYXQgc2ltcGxlIG9wZXJhdGlvbnMgY2FuIGJlIGV4dHJlbWVseSBmYXN0LgorCSIiIgorCQorCWRlZiBfX2luaXRfXyhzZWxmLCBmaWxlPU5vbmUsIHJlc19uYW1lX29yX2luZGV4PU5vbmUsIAorCQkJc2ZudFZlcnNpb249IlwwMDBcMDAxXDAwMFwwMDAiLCBjaGVja2NoZWNrc3Vtcz0wLCB2ZXJib3NlPTApOgorCQkKKwkJIiIiVGhlIGNvbnN0cnVjdG9yIGNhbiBiZSBjYWxsZWQgd2l0aCBhIGZldyBkaWZmZXJlbnQgYXJndW1lbnRzLgorCQlXaGVuIHJlYWRpbmcgYSBmb250IGZyb20gZGlzaywgJ2ZpbGUnIHNob3VsZCBiZSBlaXRoZXIgYSBwYXRobmFtZQorCQlwb2ludGluZyB0byBhIGZpbGUsIG9yIGEgcmVhZGFibGUgZmlsZSBvYmplY3QuIAorCQkKKwkJSXQgd2UncmUgcnVubmluZyBvbiBhIE1hY2ludG9zaCwgJ3Jlc19uYW1lX29yX2luZGV4JyBtYXliZSBhbiBzZm50IAorCQlyZXNvdXJjZSBuYW1lIG9yIGFuIHNmbnQgcmVzb3VyY2UgaW5kZXggbnVtYmVyIG9yIHplcm8uIFRoZSBsYXR0ZXIgCisJCWNhc2Ugd2lsbCBjYXVzZSBUVExpYiB0byBhdXRvZGV0ZWN0IHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBmbGF0IGZpbGUgCisJCW9yIGEgc3VpdGNhc2UuIChJZiBpdCdzIGEgc3VpdGNhc2UsIG9ubHkgdGhlIGZpcnN0ICdzZm50JyByZXNvdXJjZQorCQl3aWxsIGJlIHJlYWQhKQorCQkKKwkJVGhlICdjaGVja2NoZWNrc3VtcycgYXJndW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IGhvdyBzZm50CisJCWNoZWNrc3VtcyBhcmUgdHJlYXRlZCB1cG9uIHJlYWRpbmcgYSBmaWxlIGZyb20gZGlzazoKKwkJCTA6IGRvbid0IGNoZWNrIChkZWZhdWx0KQorCQkJMTogY2hlY2ssIHByaW50IHdhcm5pbmdzIGlmIGEgd3JvbmcgY2hlY2tzdW0gaXMgZm91bmQgKGRlZmF1bHQpCisJCQkyOiBjaGVjaywgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGEgd3JvbmcgY2hlY2tzdW0gaXMgZm91bmQuCisJCQorCQlUaGUgVFRGb250IGNvbnN0cnVjdG9yIGNhbiBhbHNvIGJlIGNhbGxlZCB3aXRob3V0IGEgJ2ZpbGUnIAorCQlhcmd1bWVudDogdGhpcyBpcyB0aGUgd2F5IHRvIGNyZWF0ZSBhIG5ldyBlbXB0eSBmb250LiAKKwkJSW4gdGhpcyBjYXNlIHlvdSBjYW4gb3B0aW9uYWxseSBzdXBwbHkgdGhlICdzZm50VmVyc2lvbicgYXJndW1lbnQuCisJCSIiIgorCQkKKwkJaW1wb3J0IHNmbnQKKwkJc2VsZi52ZXJib3NlID0gdmVyYm9zZQorCQlzZWxmLnRhYmxlcyA9IHt9CisJCXNlbGYucmVhZGVyID0gTm9uZQorCQlpZiBub3QgZmlsZToKKwkJCXNlbGYuc2ZudFZlcnNpb24gPSBzZm50VmVyc2lvbgorCQkJcmV0dXJuCisJCWlmIHR5cGUoZmlsZSkgPT0gdHlwZXMuU3RyaW5nVHlwZToKKwkJCWlmIG9zLm5hbWUgPT0gIm1hYyIgYW5kIHJlc19uYW1lX29yX2luZGV4IGlzIG5vdCBOb25lOgorCQkJCSMgb24gdGhlIG1hYywgd2UgZGVhbCB3aXRoIHNmbnQgcmVzb3VyY2VzIGFzIHdlbGwgYXMgZmxhdCBmaWxlcworCQkJCWltcG9ydCBtYWNVdGlscworCQkJCWlmIHJlc19uYW1lX29yX2luZGV4ID09IDA6CisJCQkJCWlmIG1hY1V0aWxzLmdldFNGTlRSZXNJbmRpY2VzKGZpbGUpOgorCQkJCQkJIyBnZXQgdGhlIGZpcnN0IGF2YWlsYWJsZSBzZm50IGZvbnQuCisJCQkJCQlmaWxlID0gbWFjVXRpbHMuU0ZOVFJlc291cmNlUmVhZGVyKGZpbGUsIDEpCisJCQkJCWVsc2U6CisJCQkJCQlmaWxlID0gb3BlbihmaWxlLCAicmIiKQorCQkJCWVsc2U6CisJCQkJCWZpbGUgPSBtYWNVdGlscy5TRk5UUmVzb3VyY2VSZWFkZXIoZmlsZSwgcmVzX25hbWVfb3JfaW5kZXgpCisJCQllbHNlOgorCQkJCWZpbGUgPSBvcGVuKGZpbGUsICJyYiIpCisJCWVsc2U6CisJCQlwYXNzICMgYXNzdW1lICJmaWxlIiBpcyBhIHJlYWRhYmxlIGZpbGUgb2JqZWN0CisJCXNlbGYucmVhZGVyID0gc2ZudC5TRk5UUmVhZGVyKGZpbGUsIGNoZWNrY2hlY2tzdW1zKQorCQlzZWxmLnNmbnRWZXJzaW9uID0gc2VsZi5yZWFkZXIuc2ZudFZlcnNpb24KKwkKKwlkZWYgY2xvc2Uoc2VsZik6CisJCSIiIklmIHdlIHN0aWxsIGhhdmUgYSByZWFkZXIgb2JqZWN0LCBjbG9zZSBpdC4iIiIKKwkJaWYgc2VsZi5yZWFkZXIgaXMgbm90IE5vbmU6CisJCQlzZWxmLnJlYWRlci5jbG9zZSgpCisJCisJZGVmIHNhdmUoc2VsZiwgZmlsZSwgbWFrZV9zdWl0Y2FzZT0wKToKKwkJIiIiU2F2ZSB0aGUgZm9udCB0byBkaXNrLiBTaW1pbGFybHkgdG8gdGhlIGNvbnN0cnVjdG9yLCAKKwkJdGhlICdmaWxlJyBhcmd1bWVudCBjYW4gYmUgZWl0aGVyIGEgcGF0aG5hbWUgb3IgYSB3cml0YWJsZQorCQlmaWxlIG9iamVjdC4KKwkJCisJCU9uIHRoZSBNYWMsIGlmIG1ha2Vfc3VpdGNhc2UgaXMgbm9uLXplcm8sIGEgc3VpdGNhc2UgZmlsZSB3aWxsCisJCXdlIG1hZGUgaW5zdGVhZCBvZiBhIGZsYXQgLnR0ZiBmaWxlLiAKKwkJIiIiCisJCWltcG9ydCBzZm50CisJCWlmIHR5cGUoZmlsZSkgPT0gdHlwZXMuU3RyaW5nVHlwZToKKwkJCWlmIG9zLm5hbWUgPT0gIm1hYyIgYW5kIG1ha2Vfc3VpdGNhc2U6CisJCQkJaW1wb3J0IG1hY1V0aWxzCisJCQkJZmlsZSA9IG1hY1V0aWxzLlNGTlRSZXNvdXJjZVdyaXRlcihmaWxlLCBzZWxmKQorCQkJZWxzZToKKwkJCQlmaWxlID0gb3BlbihmaWxlLCAid2IiKQorCQkJCWlmIG9zLm5hbWUgPT0gIm1hYyI6CisJCQkJCWltcG9ydCBtYWNmcworCQkJCQlmc3MgPSBtYWNmcy5GU1NwZWMoZmlsZS5uYW1lKQorCQkJCQlmc3MuU2V0Q3JlYXRvclR5cGUoJ21kb3MnLCAnQklOQScpCisJCWVsc2U6CisJCQlwYXNzICMgYXNzdW1lICJmaWxlIiBpcyBhIHdyaXRhYmxlIGZpbGUgb2JqZWN0CisJCQorCQl0YWdzID0gc2VsZi5rZXlzKCkKKwkJbnVtVGFibGVzID0gbGVuKHRhZ3MpCisJCXdyaXRlciA9IHNmbnQuU0ZOVFdyaXRlcihmaWxlLCBudW1UYWJsZXMsIHNlbGYuc2ZudFZlcnNpb24pCisJCQorCQlkb25lID0gW10KKwkJZm9yIHRhZyBpbiB0YWdzOgorCQkJc2VsZi5fd3JpdGVUYWJsZSh0YWcsIHdyaXRlciwgZG9uZSkKKwkJCisJCXdyaXRlci5jbG9zZSgpCisJCisJZGVmIHNhdmVYTUwoc2VsZiwgZmlsZSwgcHJvZ3Jlc3M9Tm9uZSwgdGFibGVzPU5vbmUpOgorCQkiIiJFeHBvcnQgdGhlIGZvbnQgYXMgYW4gWE1MLWJhc2VkIHRleHQgZmlsZS4KKwkJIiIiCisJCWltcG9ydCB4bWxXcml0ZXIKKwkJd3JpdGVyID0geG1sV3JpdGVyLlhNTFdyaXRlcihmaWxlKQorCQl3cml0ZXIuYmVnaW50YWcoInR0Rm9udCIsIHNmbnRWZXJzaW9uPWBzZWxmLnNmbnRWZXJzaW9uYFsxOi0xXSwgCisJCQkJdHRsaWJWZXJzaW9uPV9fdmVyc2lvbl9fKQorCQl3cml0ZXIubmV3bGluZSgpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkJaWYgbm90IHRhYmxlczoKKwkJCXRhYmxlcyA9IHNlbGYua2V5cygpCisJCW51bVRhYmxlcyA9IGxlbih0YWJsZXMpCisJCW51bUdseXBocyA9IHNlbGZbJ21heHAnXS5udW1HbHlwaHMKKwkJaWYgcHJvZ3Jlc3M6CisJCQlwcm9ncmVzcy5zZXQoMCwgbnVtVGFibGVzICogbnVtR2x5cGhzKQorCQlmb3IgaSBpbiByYW5nZShudW1UYWJsZXMpOgorCQkJdGFnID0gdGFibGVzW2ldCisJCQl0YWJsZSA9IHNlbGZbdGFnXQorCQkJcmVwb3J0ID0gIkR1bXBpbmcgJyVzJyB0YWJsZS4uLiIgJSB0YWcKKwkJCWlmIHByb2dyZXNzOgorCQkJCXByb2dyZXNzLnNldGxhYmVsKHJlcG9ydCkKKwkJCWVsaWYgc2VsZi52ZXJib3NlOgorCQkJCWRlYnVnbXNnKHJlcG9ydCkKKwkJCWVsc2U6CisJCQkJcHJpbnQgcmVwb3J0CisJCQl4bWx0YWcgPSB0YWcyeG1sdGFnKHRhZykKKwkJCXdyaXRlci5iZWdpbnRhZyh4bWx0YWcpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQlpZiB0YWcgPT0gImdseWYiOgorCQkJCXRhYmxlLnRvWE1MKHdyaXRlciwgc2VsZiwgcHJvZ3Jlc3MpCisJCQllbGlmIHRhZyA9PSAiQ0ZGICI6CisJCQkJdGFibGUudG9YTUwod3JpdGVyLCBzZWxmLCBwcm9ncmVzcykKKwkJCWVsc2U6CisJCQkJdGFibGUudG9YTUwod3JpdGVyLCBzZWxmKQorCQkJd3JpdGVyLmVuZHRhZyh4bWx0YWcpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQlpZiBwcm9ncmVzczoKKwkJCQlwcm9ncmVzcy5zZXQoaSAqIG51bUdseXBocywgbnVtVGFibGVzICogbnVtR2x5cGhzKQorCQl3cml0ZXIuZW5kdGFnKCJ0dEZvbnQiKQorCQl3cml0ZXIubmV3bGluZSgpCisJCXdyaXRlci5jbG9zZSgpCisJCWlmIHNlbGYudmVyYm9zZToKKwkJCWRlYnVnbXNnKCJEb25lIGR1bXBpbmcgWE1MIikKKwkKKwlkZWYgaW1wb3J0WE1MKHNlbGYsIGZpbGUsIHByb2dyZXNzPU5vbmUpOgorCQkiIiJJbXBvcnQgYW4gWE1MLWJhc2VkIHRleHQgZmlsZSwgc28gYXMgdG8gcmVjcmVhdGUKKwkJYSBmb250IG9iamVjdC4KKwkJIiIiCisJCWlmIHNlbGYudGFibGVzOgorCQkJcmFpc2UgZXJyb3IsICJDYW4ndCBpbXBvcnQgWE1MIGludG8gZXhpc3RpbmcgZm9udC4iCisJCWltcG9ydCB4bWxJbXBvcnQKKwkJZnJvbSB4bWwucGFyc2Vycy54bWxwcm9jIGltcG9ydCB4bWxwcm9jCisJCWJ1aWxkZXIgPSB4bWxJbXBvcnQuWE1MQXBwbGljYXRpb24oc2VsZiwgcHJvZ3Jlc3MpCisJCWlmIHByb2dyZXNzOgorCQkJcHJvZ3Jlc3Muc2V0KDAsIG9zLnN0YXQoZmlsZSlbc3RhdC5TVF9TSVpFXSAvIDEwMCBvciAxKQorCQlwcm9jID0geG1sSW1wb3J0LlVuaWNvZGVQcm9jZXNzb3IoKQorCQlwcm9jLnNldF9hcHBsaWNhdGlvbihidWlsZGVyKQorCQlwcm9jLnNldF9lcnJvcl9oYW5kbGVyKHhtbEltcG9ydC5YTUxFcnJvckhhbmRsZXIocHJvYykpCisJCWRpciwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGUpCisJCWlmIGRpcjoKKwkJCW9sZGRpciA9IG9zLmdldGN3ZCgpCisJCQlvcy5jaGRpcihkaXIpCisJCXRyeToKKwkJCXByb2MucGFyc2VfcmVzb3VyY2UoZmlsZW5hbWUpCisJCQlyb290ID0gYnVpbGRlci5yb290CisJCWZpbmFsbHk6CisJCQlpZiBkaXI6CisJCQkJb3MuY2hkaXIob2xkZGlyKQorCQkJIyByZW1vdmUgY2lyY3VsYXIgcmVmZXJlbmNlcworCQkJcHJvYy5kZXJlZigpCisJCQlkZWwgYnVpbGRlci5wcm9ncmVzcworCQorCWRlZiBpc0xvYWRlZChzZWxmLCB0YWcpOgorCQkiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgaWRlbnRpZmllZCBieSAndGFnJyBoYXMgYmVlbiAKKwkJZGVjb21waWxlZCBhbmQgbG9hZGVkIGludG8gbWVtb3J5LiIiIgorCQlyZXR1cm4gc2VsZi50YWJsZXMuaGFzX2tleSh0YWcpCisJCisJZGVmIGhhc19rZXkoc2VsZiwgdGFnKToKKwkJIiIiUHJldGVuZCB3ZSdyZSBhIGRpY3Rpb25hcnkuIiIiCisJCWlmIHNlbGYuaXNMb2FkZWQodGFnKToKKwkJCXJldHVybiAxCisJCWVsaWYgc2VsZi5yZWFkZXIgYW5kIHNlbGYucmVhZGVyLmhhc19rZXkodGFnKToKKwkJCXJldHVybiAxCisJCWVsc2U6CisJCQlyZXR1cm4gMAorCQorCWRlZiBrZXlzKHNlbGYpOgorCQkiIiJQcmV0ZW5kIHdlJ3JlIGEgZGljdGlvbmFyeS4iIiIKKwkJa2V5cyA9IHNlbGYudGFibGVzLmtleXMoKQorCQlpZiBzZWxmLnJlYWRlcjoKKwkJCWZvciBrZXkgaW4gc2VsZi5yZWFkZXIua2V5cygpOgorCQkJCWlmIGtleSBub3QgaW4ga2V5czoKKwkJCQkJa2V5cy5hcHBlbmQoa2V5KQorCQlrZXlzLnNvcnQoKQorCQlyZXR1cm4ga2V5cworCQorCWRlZiBfX2xlbl9fKHNlbGYpOgorCQkiIiJQcmV0ZW5kIHdlJ3JlIGEgZGljdGlvbmFyeS4iIiIKKwkJcmV0dXJuIGxlbihzZWxmLmtleXMoKSkKKwkKKwlkZWYgX19nZXRpdGVtX18oc2VsZiwgdGFnKToKKwkJIiIiUHJldGVuZCB3ZSdyZSBhIGRpY3Rpb25hcnkuIiIiCisJCXRyeToKKwkJCXJldHVybiBzZWxmLnRhYmxlc1t0YWddCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCWlmIHNlbGYucmVhZGVyIGlzIG5vdCBOb25lOgorCQkJCWlmIHNlbGYudmVyYm9zZToKKwkJCQkJZGVidWdtc2coInJlYWRpbmcgJyVzJyB0YWJsZSBmcm9tIGRpc2siICUgdGFnKQorCQkJCWRhdGEgPSBzZWxmLnJlYWRlclt0YWddCisJCQkJdGFibGVjbGFzcyA9IGdldFRhYmxlQ2xhc3ModGFnKQorCQkJCXRhYmxlID0gdGFibGVjbGFzcyh0YWcpCisJCQkJc2VsZi50YWJsZXNbdGFnXSA9IHRhYmxlCisJCQkJaWYgc2VsZi52ZXJib3NlOgorCQkJCQlkZWJ1Z21zZygiZGVjb21waWxpbmcgJyVzJyB0YWJsZSIgJSB0YWcpCisJCQkJdGFibGUuZGVjb21waWxlKGRhdGEsIHNlbGYpCisJCQkJcmV0dXJuIHRhYmxlCisJCQllbHNlOgorCQkJCXJhaXNlIEtleUVycm9yLCAiJyVzJyB0YWJsZSBub3QgZm91bmQiICUgdGFnCisJCisJZGVmIF9fc2V0aXRlbV9fKHNlbGYsIHRhZywgdGFibGUpOgorCQkiIiJQcmV0ZW5kIHdlJ3JlIGEgZGljdGlvbmFyeS4iIiIKKwkJc2VsZi50YWJsZXNbdGFnXSA9IHRhYmxlCisJCisJZGVmIF9fZGVsaXRlbV9fKHNlbGYsIHRhZyk6CisJCSIiIlByZXRlbmQgd2UncmUgYSBkaWN0aW9uYXJ5LiIiIgorCQlkZWwgc2VsZi50YWJsZXNbdGFnXQorCQorCWRlZiBzZXRHbHlwaE9yZGVyKHNlbGYsIGdseXBoT3JkZXIpOgorCQlzZWxmLmdseXBoT3JkZXIgPSBnbHlwaE9yZGVyCisJCWlmIHNlbGYuaGFzX2tleSgnQ0ZGICcpOgorCQkJc2VsZlsnQ0ZGICddLnNldEdseXBoT3JkZXIoZ2x5cGhPcmRlcikKKwkJaWYgc2VsZi5oYXNfa2V5KCdnbHlmJyk6CisJCQlzZWxmWydnbHlmJ10uc2V0R2x5cGhPcmRlcihnbHlwaE9yZGVyKQorCQorCWRlZiBnZXRHbHlwaE9yZGVyKHNlbGYpOgorCQlpZiBub3QgaGFzYXR0cihzZWxmLCAiZ2x5cGhPcmRlciIpOgorCQkJaWYgc2VsZi5oYXNfa2V5KCdDRkYgJyk6CisJCQkJIyBDRkYgT3BlblR5cGUgZm9udAorCQkJCXNlbGYuZ2x5cGhPcmRlciA9IHNlbGZbJ0NGRiAnXS5nZXRHbHlwaE9yZGVyKCkKKwkJCWVsc2U6CisJCQkJIyBUcnVlVHlwZSBmb250CisJCQkJZ2x5cGhPcmRlciA9IHNlbGZbJ3Bvc3QnXS5nZXRHbHlwaE9yZGVyKCkKKwkJCQlpZiBnbHlwaE9yZGVyIGlzIE5vbmU6CisJCQkJCSMKKwkJCQkJIyBObyBuYW1lcyBmb3VuZCBpbiB0aGUgJ3Bvc3QnIHRhYmxlLgorCQkJCQkjIFRyeSB0byBjcmVhdGUgZ2x5cGggbmFtZXMgZnJvbSB0aGUgdW5pY29kZSBjbWFwIChpZiBhdmFpbGFibGUpIAorCQkJCQkjIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIEFkb2JlIEdseXBoIExpc3QgKEFHTCkuCisJCQkJCSMKKwkJCQkJc2VsZi5fZ2V0R2x5cGhOYW1lc0Zyb21DbWFwKCkKKwkJCQllbHNlOgorCQkJCQlzZWxmLmdseXBoT3JkZXIgPSBnbHlwaE9yZGVyCisJCQkjIFhYWCB3aGF0IGlmIGEgZm9udCBjb250YWlucyAnZ2x5ZicvJ3Bvc3QnIHRhYmxlICphbmQqIENGRj8KKwkJcmV0dXJuIHNlbGYuZ2x5cGhPcmRlcgorCQorCWRlZiBfZ2V0R2x5cGhOYW1lc0Zyb21DbWFwKHNlbGYpOgorCQkjIE1ha2UgdXAgZ2x5cGggbmFtZXMgYmFzZWQgb24gZ2x5cGhJRCwgd2hpY2ggd2lsbCBiZSB1c2VkIAorCQkjIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhIHVuaWNvZGUgY21hcC4KKwkJbnVtR2x5cGhzID0gaW50KHNlbGZbJ21heHAnXS5udW1HbHlwaHMpCisJCWdseXBoT3JkZXIgPSBbTm9uZV0gKiBudW1HbHlwaHMKKwkJZ2x5cGhPcmRlclswXSA9ICIubm90ZGVmIgorCQlmb3IgaSBpbiByYW5nZSgxLCBudW1HbHlwaHMpOgorCQkJZ2x5cGhPcmRlcltpXSA9ICJnbHlwaCUuNWQiICUgaQorCQkjIFNldCB0aGUgZ2x5cGggb3JkZXIsIHNvIHRoZSBjbWFwIHBhcnNlciBoYXMgc29tZXRoaW5nCisJCSMgdG8gd29yayB3aXRoCisJCXNlbGYuZ2x5cGhPcmRlciA9IGdseXBoT3JkZXIKKwkJIyBHZXQgdGhlIHRlbXBvcmFyeSBjbWFwIChiYXNlZCBvbiB0aGUganVzdCBpbnZlbnRlZCBuYW1lcykKKwkJdGVtcGNtYXAgPSBzZWxmWydjbWFwJ10uZ2V0Y21hcCgzLCAxKQorCQlpZiB0ZW1wY21hcCBpcyBub3QgTm9uZToKKwkJCSMgd2UgaGF2ZSBhIHVuaWNvZGUgY21hcAorCQkJaW1wb3J0IGFnbCwgc3RyaW5nCisJCQljbWFwID0gdGVtcGNtYXAuY21hcAorCQkJIyBjcmVhdGUgYSByZXZlcnNlIGNtYXAgZGljdAorCQkJcmV2ZXJzZWNtYXAgPSB7fQorCQkJZm9yIHVuaWNvZGUsIG5hbWUgaW4gY21hcC5pdGVtcygpOgorCQkJCXJldmVyc2VjbWFwW25hbWVdID0gdW5pY29kZQorCQkJYXNzZXJ0IGxlbihyZXZlcnNlY21hcCkgPT0gbGVuKGNtYXApCisJCQlmb3IgaSBpbiByYW5nZShudW1HbHlwaHMpOgorCQkJCXRlbXBOYW1lID0gZ2x5cGhPcmRlcltpXQorCQkJCWlmIHJldmVyc2VjbWFwLmhhc19rZXkodGVtcE5hbWUpOgorCQkJCQl1bmljb2RlID0gcmV2ZXJzZWNtYXBbdGVtcE5hbWVdCisJCQkJCWlmIGFnbC5VVjJBR0wuaGFzX2tleSh1bmljb2RlKToKKwkJCQkJCSMgZ2V0IG5hbWUgZnJvbSB0aGUgQWRvYmUgR2x5cGggTGlzdAorCQkJCQkJZ2x5cGhPcmRlcltpXSA9IGFnbC5VVjJBR0xbdW5pY29kZV0KKwkJCQkJZWxzZToKKwkJCQkJCSMgY3JlYXRlIHVuaTxDT0RFPiBuYW1lCisJCQkJCQlnbHlwaE9yZGVyW2ldID0gInVuaSIgKyBzdHJpbmcudXBwZXIoc3RyaW5nLnpmaWxsKGhleCh1bmljb2RlKVsyOl0sIDQpKQorCQkJIyBEZWxldGUgdGhlIGNtYXAgdGFibGUgZnJvbSB0aGUgY2FjaGUsIHNvIGl0IGNhbiBiZSAKKwkJCSMgcGFyc2VkIGFnYWluIHdpdGggdGhlIHJpZ2h0IG5hbWVzLgorCQkJZGVsIHNlbGYudGFibGVzWydjbWFwJ10KKwkJZWxzZToKKwkJCXBhc3MgIyBubyB1bmljb2RlIGNtYXAgYXZhaWxhYmxlLCBzdGljayB3aXRoIHRoZSBpbnZlbnRlZCBuYW1lcworCQlzZWxmLmdseXBoT3JkZXIgPSBnbHlwaE9yZGVyCisJCisJZGVmIGdldEdseXBoTmFtZXMoc2VsZik6CisJCSIiIkdldCBhIGxpc3Qgb2YgZ2x5cGggbmFtZXMsIHNvcnRlZCBhbHBoYWJldGljYWxseS4iIiIKKwkJZ2x5cGhOYW1lcyA9IHNlbGYuZ2V0R2x5cGhPcmRlcigpWzpdCisJCWdseXBoTmFtZXMuc29ydCgpCisJCXJldHVybiBnbHlwaE5hbWVzCisJCisJZGVmIGdldEdseXBoTmFtZXMyKHNlbGYpOgorCQkiIiJHZXQgYSBsaXN0IG9mIGdseXBoIG5hbWVzLCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHksIGJ1dCBub3QgY2FzZSBzZW5zaXRpdmUuIiIiCisJCWZyb20gZm9udFRvb2xzLm1pc2MgaW1wb3J0IHRleHRUb29scworCQlyZXR1cm4gdGV4dFRvb2xzLmNhc2VsZXNzU29ydChzZWxmLmdldEdseXBoT3JkZXIoKSkKKwkKKwlkZWYgZ2V0R2x5cGhOYW1lKHNlbGYsIGdseXBoSUQpOgorCQlyZXR1cm4gc2VsZi5nZXRHbHlwaE9yZGVyKClbZ2x5cGhJRF0KKwkKKwlkZWYgZ2V0R2x5cGhJRChzZWxmLCBnbHlwaE5hbWUpOgorCQlpZiBub3QgaGFzYXR0cihzZWxmLCAiX3JldmVyc2VHbHlwaE9yZGVyRGljdCIpOgorCQkJc2VsZi5fYnVpbGRSZXZlcnNlR2x5cGhPcmRlckRpY3QoKQorCQlnbHlwaE9yZGVyID0gc2VsZi5nZXRHbHlwaE9yZGVyKCkKKwkJZCA9IHNlbGYuX3JldmVyc2VHbHlwaE9yZGVyRGljdAorCQlpZiBub3QgZC5oYXNfa2V5KGdseXBoTmFtZSk6CisJCQlpZiBnbHlwaE5hbWUgaW4gZ2x5cGhPcmRlcjoKKwkJCQlzZWxmLl9idWlsZFJldmVyc2VHbHlwaE9yZGVyRGljdCgpCisJCQkJcmV0dXJuIHNlbGYuZ2V0R2x5cGhJRChnbHlwaE5hbWUpCisJCQllbHNlOgorCQkJCXJhaXNlIEtleUVycm9yLCBnbHlwaE5hbWUKKwkJZ2x5cGhJRCA9IGRbZ2x5cGhOYW1lXQorCQlpZiBnbHlwaE5hbWUgPD4gZ2x5cGhPcmRlcltnbHlwaElEXToKKwkJCXNlbGYuX2J1aWxkUmV2ZXJzZUdseXBoT3JkZXJEaWN0KCkKKwkJCXJldHVybiBzZWxmLmdldEdseXBoSUQoZ2x5cGhOYW1lKQorCQlyZXR1cm4gZ2x5cGhJRAorCQorCWRlZiBfYnVpbGRSZXZlcnNlR2x5cGhPcmRlckRpY3Qoc2VsZik6CisJCXNlbGYuX3JldmVyc2VHbHlwaE9yZGVyRGljdCA9IGQgPSB7fQorCQlnbHlwaE9yZGVyID0gc2VsZi5nZXRHbHlwaE9yZGVyKCkKKwkJZm9yIGdseXBoSUQgaW4gcmFuZ2UobGVuKGdseXBoT3JkZXIpKToKKwkJCWRbZ2x5cGhPcmRlcltnbHlwaElEXV0gPSBnbHlwaElECisJCisJZGVmIF93cml0ZVRhYmxlKHNlbGYsIHRhZywgd3JpdGVyLCBkb25lKToKKwkJIiIiSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIGZvciBzZWxmLnNhdmUoKS4gS2VlcHMgdHJhY2sgb2YgCisJCWludGVyLXRhYmxlIGRlcGVuZGVuY2llcy4KKwkJIiIiCisJCWlmIHRhZyBpbiBkb25lOgorCQkJcmV0dXJuCisJCXRhYmxlY2xhc3MgPSBnZXRUYWJsZUNsYXNzKHRhZykKKwkJZm9yIG1hc3RlclRhYmxlIGluIHRhYmxlY2xhc3MuZGVwZW5kZW5jaWVzOgorCQkJaWYgbWFzdGVyVGFibGUgbm90IGluIGRvbmU6CisJCQkJaWYgc2VsZi5oYXNfa2V5KG1hc3RlclRhYmxlKToKKwkJCQkJc2VsZi5fd3JpdGVUYWJsZShtYXN0ZXJUYWJsZSwgd3JpdGVyLCBkb25lKQorCQkJCWVsc2U6CisJCQkJCWRvbmUuYXBwZW5kKG1hc3RlclRhYmxlKQorCQl0YWJsZWRhdGEgPSBzZWxmLl9nZXRUYWJsZURhdGEodGFnKQorCQlpZiBzZWxmLnZlcmJvc2U6CisJCQlkZWJ1Z21zZygid3JpdGluZyAnJXMnIHRhYmxlIHRvIGRpc2siICUgdGFnKQorCQl3cml0ZXJbdGFnXSA9IHRhYmxlZGF0YQorCQlkb25lLmFwcGVuZCh0YWcpCisJCisJZGVmIF9nZXRUYWJsZURhdGEoc2VsZiwgdGFnKToKKwkJIiIiSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uLiBSZXR1cm5zIHJhdyB0YWJsZSBkYXRhLAorCQl3aGV0aGVyIGNvbXBpbGVkIG9yIGRpcmVjdGx5IHJlYWQgZnJvbSBkaXNrLgorCQkiIiIKKwkJaWYgc2VsZi5pc0xvYWRlZCh0YWcpOgorCQkJaWYgc2VsZi52ZXJib3NlOgorCQkJCWRlYnVnbXNnKCJjb21waWxpbmcgJyVzJyB0YWJsZSIgJSB0YWcpCisJCQlyZXR1cm4gc2VsZi50YWJsZXNbdGFnXS5jb21waWxlKHNlbGYpCisJCWVsaWYgc2VsZi5yZWFkZXIgYW5kIHNlbGYucmVhZGVyLmhhc19rZXkodGFnKToKKwkJCWlmIHNlbGYudmVyYm9zZToKKwkJCQlkZWJ1Z21zZygicmVhZGluZyAnJXMnIHRhYmxlIGZyb20gZGlzayIgJSB0YWcpCisJCQlyZXR1cm4gc2VsZi5yZWFkZXJbdGFnXQorCQllbHNlOgorCQkJcmFpc2UgS2V5RXJyb3IsIHRhZworCisKK2RlZiBfdGVzdF9lbmRpYW5uZXNzKCk6CisJIiIiVGVzdCB0aGUgZW5kaWFubmVzcyBvZiB0aGUgbWFjaGluZS4gVGhpcyBpcyBjcnVjaWFsIHRvIGtub3cKKwlzaW5jZSBUcnVlVHlwZSBkYXRhIGlzIGFsd2F5cyBiaWcgZW5kaWFuLCBldmVuIG9uIGxpdHRsZSBlbmRpYW4KKwltYWNoaW5lcy4gVGhlcmUgYXJlIHF1aXRlIGEgZmV3IHNpdHVhdGlvbnMgd2hlcmUgd2UgZXhwbGljaXRseQorCW5lZWQgdG8gc3dhcCBzb21lIGJ5dGVzLgorCSIiIgorCWltcG9ydCBzdHJ1Y3QKKwlkYXRhID0gc3RydWN0LnBhY2soImgiLCAweDAxKQorCWlmIGRhdGEgPT0gIlwwMDBcMDAxIjoKKwkJcmV0dXJuICJiaWciCisJZWxpZiBkYXRhID09ICJcMDAxXDAwMCI6CisJCXJldHVybiAibGl0dGxlIgorCWVsc2U6CisJCWFzc2VydCAwLCAiZW5kaWFuIGNvbmZ1c2lvbiEiCisKK2VuZGlhbiA9IF90ZXN0X2VuZGlhbm5lc3MoKQorCisKK2RlZiBnZXRUYWJsZU1vZHVsZSh0YWcpOgorCSIiIkZldGNoIHRoZSBwYWNrZXIvdW5wYWNrZXIgbW9kdWxlIGZvciBhIHRhYmxlLiAKKwlSZXR1cm4gTm9uZSB3aGVuIG5vIG1vZHVsZSBpcyBmb3VuZC4KKwkiIiIKKwlpbXBvcnQgaW1wCisJaW1wb3J0IHRhYmxlcworCXB5X3RhZyA9IHRhZzJpZGVudGlmaWVyKHRhZykKKwl0cnk6CisJCWYsIHBhdGgsIGtpbmQgPSBpbXAuZmluZF9tb2R1bGUocHlfdGFnLCB0YWJsZXMuX19wYXRoX18pCisJCWlmIGY6CisJCQlmLmNsb3NlKCkKKwlleGNlcHQgSW1wb3J0RXJyb3I6CisJCXJldHVybiBOb25lCisJZWxzZToKKwkJbW9kdWxlID0gX19pbXBvcnRfXygiZm9udFRvb2xzLnR0TGliLnRhYmxlcy4iICsgcHlfdGFnKQorCQlyZXR1cm4gZ2V0YXR0cih0YWJsZXMsIHB5X3RhZykKKworCitkZWYgZ2V0VGFibGVDbGFzcyh0YWcpOgorCSIiIkZldGNoIHRoZSBwYWNrZXIvdW5wYWNrZXIgY2xhc3MgZm9yIGEgdGFibGUuIAorCVJldHVybiBOb25lIHdoZW4gbm8gY2xhc3MgaXMgZm91bmQuCisJIiIiCisJbW9kdWxlID0gZ2V0VGFibGVNb2R1bGUodGFnKQorCWlmIG1vZHVsZSBpcyBOb25lOgorCQlmcm9tIHRhYmxlcy5EZWZhdWx0VGFibGUgaW1wb3J0IERlZmF1bHRUYWJsZQorCQlyZXR1cm4gRGVmYXVsdFRhYmxlCisJcHlfdGFnID0gdGFnMmlkZW50aWZpZXIodGFnKQorCXRhYmxlY2xhc3MgPSBnZXRhdHRyKG1vZHVsZSwgInRhYmxlXyIgKyBweV90YWcpCisJcmV0dXJuIHRhYmxlY2xhc3MKKworCitkZWYgbmV3dGFibGUodGFnKToKKwkiIiJSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgYSB0YWJsZS4iIiIKKwl0YWJsZWNsYXNzID0gZ2V0VGFibGVDbGFzcyh0YWcpCisJcmV0dXJuIHRhYmxlY2xhc3ModGFnKQorCisKK2RlZiBfZXNjYXBlY2hhcihjKToKKwkiIiJIZWxwZXIgZnVuY3Rpb24gZm9yIHRhZzJpZGVudGlmaWVyKCkiIiIKKwlpbXBvcnQgcmUKKwlpZiByZS5tYXRjaCgiW2EtejAtOV0iLCBjKToKKwkJcmV0dXJuICJfIiArIGMKKwllbGlmIHJlLm1hdGNoKCJbQS1aXSIsIGMpOgorCQlyZXR1cm4gYyArICJfIgorCWVsc2U6CisJCXJldHVybiBoZXgob3JkKGMpKVsyOl0KKworCitkZWYgdGFnMmlkZW50aWZpZXIodGFnKToKKwkiIiJDb252ZXJ0IGEgdGFibGUgdGFnIHRvIGEgdmFsaWQgKGJ1dCBVR0xZKSBweXRob24gaWRlbnRpZmllciwgCisJYXMgd2VsbCBhcyBhIGZpbGVuYW1lIHRoYXQncyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBldmVuIG9uIGEgCisJY2FzZWxlc3MgZmlsZSBzeXN0ZW0uIEVhY2ggY2hhcmFjdGVyIGlzIG1hcHBlZCB0byB0d28gY2hhcmFjdGVycy4KKwlMb3dlcmNhc2UgbGV0dGVycyBnZXQgYW4gdW5kZXJzY29yZSBiZWZvcmUgdGhlIGxldHRlciwgdXBwZXJjYXNlCisJbGV0dGVycyBnZXQgYW4gdW5kZXJzY29yZSBhZnRlciB0aGUgbGV0dGVyLiBUcmFpbGluZyBzcGFjZXMgYXJlCisJdHJpbW1lZC4gSWxsZWdhbCBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIGFzIHR3byBoZXggYnl0ZXMuIElmIHRoZQorCXJlc3VsdCBzdGFydHMgd2l0aCBhIG51bWJlciAoYXMgdGhlIHJlc3VsdCBvZiBhIGhleCBlc2NhcGUpLCBhbgorCWV4dHJhIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLiBFeGFtcGxlczogCisJCSdnbHlmJyAtPiAnX2dfbF95X2YnCisJCSdjdnQgJyAtPiAnX2Nfdl90JworCQknT1MvMicgLT4gJ09fU18yZl8yJworCSIiIgorCWltcG9ydCByZQorCWFzc2VydCBsZW4odGFnKSA9PSA0LCAidGFnIHNob3VsZCBiZSA0IGNoYXJhY3RlcnMgbG9uZyIKKwl3aGlsZSBsZW4odGFnKSA+IDEgYW5kIHRhZ1stMV0gPT0gJyAnOgorCQl0YWcgPSB0YWdbOi0xXQorCWlkZW50ID0gIiIKKwlmb3IgYyBpbiB0YWc6CisJCWlkZW50ID0gaWRlbnQgKyBfZXNjYXBlY2hhcihjKQorCWlmIHJlLm1hdGNoKCJbMC05XSIsIGlkZW50KToKKwkJaWRlbnQgPSAiXyIgKyBpZGVudAorCXJldHVybiBpZGVudAorCisKK2RlZiBpZGVudGlmaWVyMnRhZyhpZGVudCk6CisJIiIidGhlIG9wcG9zaXRlIG9mIHRhZzJpZGVudGlmaWVyKCkiIiIKKwlpbXBvcnQgc3RyaW5nCisJaWYgbGVuKGlkZW50KSAlIDIgYW5kIGlkZW50WzBdID09ICJfIjoKKwkJaWRlbnQgPSBpZGVudFsxOl0KKwlhc3NlcnQgbm90IChsZW4oaWRlbnQpICUgMikKKwl0YWcgPSAiIgorCWZvciBpIGluIHJhbmdlKDAsIGxlbihpZGVudCksIDIpOgorCQlpZiBpZGVudFtpXSA9PSAiXyI6CisJCQl0YWcgPSB0YWcgKyBpZGVudFtpKzFdCisJCWVsaWYgaWRlbnRbaSsxXSA9PSAiXyI6CisJCQl0YWcgPSB0YWcgKyBpZGVudFtpXQorCQllbHNlOgorCQkJIyBhc3N1bWUgaGV4CisJCQl0YWcgPSB0YWcgKyBjaHIoc3RyaW5nLmF0b2koaWRlbnRbaTppKzJdLCAxNikpCisJIyBhcHBlbmQgdHJhaWxpbmcgc3BhY2VzCisJdGFnID0gdGFnICsgKDQgLSBsZW4odGFnKSkgKiAnICcKKwlyZXR1cm4gdGFnCisKKworZGVmIHRhZzJ4bWx0YWcodGFnKToKKwkiIiJTaW1pbGFybHkgdG8gdGFnMmlkZW50aWZpZXIoKSwgdGhpcyBjb252ZXJ0cyBhIFRUIHRhZworCXRvIGEgdmFsaWQgWE1MIGVsZW1lbnQgbmFtZS4gU2luY2UgWE1MIGVsZW1lbnQgbmFtZXMgYXJlCisJY2FzZSBzZW5zaXRpdmUsIHRoaXMgaXMgYSBmYWlybHkgc2ltcGxlL3JlYWRhYmxlIHRyYW5zbGF0aW9uLgorCSIiIgorCWltcG9ydCBzdHJpbmcsIHJlCisJaWYgdGFnID09ICJPUy8yIjoKKwkJcmV0dXJuICJPU18yIgorCWlmIHJlLm1hdGNoKCJbQS1aYS16X11bQS1aYS16XzAtOV0qICokIiwgdGFnKToKKwkJcmV0dXJuIHN0cmluZy5zdHJpcCh0YWcpCisJZWxzZToKKwkJcmV0dXJuIHRhZzJpZGVudGlmaWVyKHRhZykKKworCitkZWYgeG1sdGFnMnRhZyh0YWcpOgorCSIiIlRoZSBvcHBvc2l0ZSBvZiB0YWcyeG1sdGFnKCkiIiIKKwlpZiB0YWcgPT0gIk9TXzIiOgorCQlyZXR1cm4gIk9TLzIiCisJaWYgbGVuKHRhZykgPT0gODoKKwkJcmV0dXJuIGlkZW50aWZpZXIydGFnKHRhZykKKwllbHNlOgorCQlyZXR1cm4gdGFnICsgIiAiICogKDQgLSBsZW4odGFnKSkKKwlyZXR1cm4gdGFnCisKKworZGVmIGRlYnVnbXNnKG1zZyk6CisJaW1wb3J0IHRpbWUKKwlwcmludCBtc2cgKyB0aW1lLnN0cmZ0aW1lKCIgICglSDolTTolUykiLCB0aW1lLmxvY2FsdGltZSh0aW1lLnRpbWUoKSkpCisKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi9tYWNVdGlscy5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvbWFjVXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjZTNiNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvbWFjVXRpbHMucHkKQEAgLTAsMCArMSwyMTIgQEAKKyIiInR0TGliLm1hY1V0aWxzLnB5IC0tIFZhcmlvdXMgTWFjLXNwZWNpZmljIHN0dWZmLiIiIgorCisKK2ltcG9ydCBvcworaWYgb3MubmFtZSA8PiAibWFjIjoKKwlyYWlzZSBJbXBvcnRFcnJvciwgIlRoaXMgbW9kdWxlIGlzIE1hYy1vbmx5ISIKKworaW1wb3J0IFJlcywgbWFjZnMKK2ltcG9ydCBjU3RyaW5nSU8KKworCitkZWYgZ2V0U0ZOVFJlc0luZGljZXMocGF0aCk6CisJIiIiRGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGhhcyBhIHJlc291cmNlIGZvcmsgb3Igbm90LiIiIgorCWZzcyA9IG1hY2ZzLkZTU3BlYyhwYXRoKQorCXRyeToKKwkJcmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKGZzcywgMSkgICMgcmVhZCBvbmx5CisJZXhjZXB0IFJlcy5FcnJvcjoKKwkJcmV0dXJuIFtdCisJUmVzLlVzZVJlc0ZpbGUocmVzcmVmKQorCW51bVNGTlRzID0gUmVzLkNvdW50MVJlc291cmNlcygnc2ZudCcpCisJUmVzLkNsb3NlUmVzRmlsZShyZXNyZWYpCisJcmV0dXJuIHJhbmdlKDEsIG51bVNGTlRzICsgMSkKKworCitkZWYgb3BlblRURm9udHMocGF0aCk6CisJIiIiR2l2ZW4gYSBwYXRobmFtZSwgcmV0dXJuIGEgbGlzdCBvZiBUVEZvbnQgb2JqZWN0cy4gSW4gdGhlIGNhc2UgCisJb2YgYSBmbGF0IFRURi9PVEYgZmlsZSwgdGhlIGxpc3Qgd2lsbCBjb250YWluIGp1c3Qgb25lIGZvbnQgb2JqZWN0OworCWJ1dCBpbiB0aGUgY2FzZSBvZiBhIE1hYyBmb250IHN1aXRjYXNlIGl0IHdpbGwgY29udGFpbiBhcyBtYW55CisJZm9udCBvYmplY3RzIGFzIHRoZXJlIGFyZSBzZm50IHJlc291cmNlcyBpbiB0aGUgZmlsZS4KKwkiIiIKKwlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwlmb250cyA9IFtdCisJc2ZudHMgPSBnZXRTRk5UUmVzSW5kaWNlcyhwYXRoKQorCWlmIG5vdCBzZm50czoKKwkJZm9udHMuYXBwZW5kKHR0TGliLlRURm9udChwYXRoKSkKKwllbHNlOgorCQlmb3IgaW5kZXggaW4gc2ZudHM6CisJCQlmb250cy5hcHBlbmQodHRMaWIuVFRGb250KHBhdGgsIGluZGV4KSkKKwkJaWYgbm90IGZvbnRzOgorCQkJcmFpc2UgdHRMaWIuVFRMaWJFcnJvciwgIm5vIGZvbnRzIGZvdW5kIGluIGZpbGUgJyVzJyIgJSBwYXRoCisJcmV0dXJuIGZvbnRzCisKKworY2xhc3MgUHJvZ3Jlc3NCYXI6CisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlLCBtYXh2YWw9MTAwKToKKwkJaW1wb3J0IEVhc3lEaWFsb2dzCisJCXNlbGYuYmFyID0gRWFzeURpYWxvZ3MuUHJvZ3Jlc3NCYXIodGl0bGUsIG1heHZhbD1tYXh2YWwpCisJCisJZGVmIHNldChzZWxmLCB2YWwsIG1heHZhbD1Ob25lKToKKwkJaWYgbWF4dmFsIDw+IE5vbmU6CisJCQlzZWxmLmJhci5tYXh2YWwgPSBtYXh2YWwKKwkJc2VsZi5iYXIuc2V0KHZhbCkKKwkKKwlkZWYgaW5jcmVtZW50KHNlbGYsIHZhbD0xKToKKwkJc2VsZi5iYXIuaW5jKHZhbCkKKwkKKwlkZWYgc2V0bGFiZWwoc2VsZiwgdGV4dCk6CisJCXNlbGYuYmFyLmxhYmVsKHRleHQpCisJCisJZGVmIGNsb3NlKHNlbGYpOgorCQlzZWxmLmJhci5kLkhpZGVXaW5kb3coKQorCQlkZWwgc2VsZi5iYXIKKworCitjbGFzcyBTRk5UUmVzb3VyY2VSZWFkZXI6CisJCisJIiIiU2ltcGxlIChNYWMtb25seSkgcmVhZC1vbmx5IGZpbGUgd3JhcHBlciBmb3IgJ3NmbnQnIHJlc291cmNlcy4iIiIKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgcmVzX25hbWVfb3JfaW5kZXgpOgorCQlmc3MgPSBtYWNmcy5GU1NwZWMocGF0aCkKKwkJcmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKGZzcywgMSkgICMgcmVhZC1vbmx5CisJCVJlcy5Vc2VSZXNGaWxlKHJlc3JlZikKKwkJaWYgdHlwZShyZXNfbmFtZV9vcl9pbmRleCkgPT0gdHlwZSgiIik6CisJCQlyZXMgPSBSZXMuR2V0MU5hbWVkUmVzb3VyY2UoJ3NmbnQnLCByZXNfbmFtZV9vcl9pbmRleCkKKwkJZWxzZToKKwkJCXJlcyA9IFJlcy5HZXQxSW5kUmVzb3VyY2UoJ3NmbnQnLCByZXNfbmFtZV9vcl9pbmRleCkKKwkJc2VsZi5maWxlID0gY1N0cmluZ0lPLlN0cmluZ0lPKHJlcy5kYXRhKQorCQlSZXMuQ2xvc2VSZXNGaWxlKHJlc3JlZikKKwkJc2VsZi5uYW1lID0gcGF0aAorCQorCWRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKwkJIyBjaGVhcCBpbmhlcml0YW5jZQorCQlyZXR1cm4gZ2V0YXR0cihzZWxmLmZpbGUsIGF0dHIpCisKKworY2xhc3MgU0ZOVFJlc291cmNlV3JpdGVyOgorCQorCSIiIlNpbXBsZSAoTWFjLW9ubHkpIGZpbGUgd3JhcHBlciBmb3IgJ3NmbnQnIHJlc291cmNlcy4iIiIKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdHRGb250LCByZXNfaWQ9Tm9uZSk6CisJCXNlbGYuZmlsZSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisJCXNlbGYubmFtZSA9IHBhdGgKKwkJc2VsZi5jbG9zZWQgPSAwCisJCWZ1bGxuYW1lID0gdHRGb250WyduYW1lJ10uZ2V0bmFtZSg0LCAxLCAwKSAjIEZ1bGwgbmFtZSwgbWFjLCBkZWZhdWx0IGVuY29kaW5nCisJCWZhbWlseW5hbWUgPSB0dEZvbnRbJ25hbWUnXS5nZXRuYW1lKDEsIDEsIDApICMgRmFtLiBuYW1lLCBtYWMsIGRlZmF1bHQgZW5jb2RpbmcKKwkJcHNuYW1lID0gdHRGb250WyduYW1lJ10uZ2V0bmFtZSg2LCAxLCAwKSAjIFBvc3RTY3JpcHQgbmFtZSwgZXRjLgorCQlpZiBmdWxsbmFtZSBpcyBOb25lIG9yIGZ1bGxuYW1lIGlzIE5vbmUgb3IgcHNuYW1lIGlzIE5vbmU6CisJCQlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJjYW4ndCBtYWtlICdzZm50JyByZXNvdXJjZSwgbm8gTWFjaW50b3NoICduYW1lJyB0YWJsZSBmb3VuZCIKKwkJc2VsZi5mdWxsbmFtZSA9IGZ1bGxuYW1lLnN0cmluZworCQlzZWxmLmZhbWlseW5hbWUgPSBmYW1pbHluYW1lLnN0cmluZworCQlzZWxmLnBzbmFtZSA9IHBzbmFtZS5zdHJpbmcKKwkJaWYgc2VsZi5mYW1pbHluYW1lIDw+IHNlbGYucHNuYW1lWzpsZW4oc2VsZi5mYW1pbHluYW1lKV06CisJCQkjIHVnaC4gZm9yY2UgZmFtIG5hbWUgdG8gYmUgdGhlIHNhbWUgYXMgZmlyc3QgcGFydCBvZiBwcyBuYW1lLAorCQkJIyBmb25kTGliIG90aGVyd2lzZSBiYXJmcy4KKwkJCWZvciBpIGluIHJhbmdlKG1pbihsZW4oc2VsZi5wc25hbWUpLCBsZW4oc2VsZi5mYW1pbHluYW1lKSkpOgorCQkJCWlmIHNlbGYuZmFtaWx5bmFtZVtpXSA8PiBzZWxmLnBzbmFtZVtpXToKKwkJCQkJYnJlYWsKKwkJCXNlbGYuZmFtaWx5bmFtZSA9IHNlbGYucHNuYW1lWzppXQorCQkKKwkJc2VsZi50dEZvbnQgPSB0dEZvbnQKKwkJc2VsZi5yZXNfaWQgPSByZXNfaWQKKwkJZnNzID0gbWFjZnMuRlNTcGVjKHNlbGYubmFtZSkKKwkJaWYgb3MucGF0aC5leGlzdHMoc2VsZi5uYW1lKToKKwkJCW9zLnJlbW92ZShzZWxmLm5hbWUpCisJCVJlcy5GU3BDcmVhdGVSZXNGaWxlKGZzcywgJ0RNT1YnLCAnRkZJTCcsIDApCisJCXNlbGYucmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKGZzcywgMykgICMgZXhjbHVzaXZlIHJlYWQvd3JpdGUgcGVybWlzc2lvbgorCQorCWRlZiBjbG9zZShzZWxmKToKKwkJaWYgc2VsZi5jbG9zZWQ6CisJCQlyZXR1cm4KKwkJUmVzLlVzZVJlc0ZpbGUoc2VsZi5yZXNyZWYpCisJCXRyeToKKwkJCXJlcyA9IFJlcy5HZXQxTmFtZWRSZXNvdXJjZSgnc2ZudCcsIHNlbGYuZnVsbG5hbWUpCisJCWV4Y2VwdCBSZXMuRXJyb3I6CisJCQlwYXNzCisJCWVsc2U6CisJCQlyZXMuUmVtb3ZlUmVzb3VyY2UoKQorCQlyZXMgPSBSZXMuUmVzb3VyY2Uoc2VsZi5maWxlLmdldHZhbHVlKCkpCisJCWlmIHNlbGYucmVzX2lkIGlzIE5vbmU6CisJCQlzZWxmLnJlc19pZCA9IFJlcy5VbmlxdWUxSUQoJ3NmbnQnKQorCQlyZXMuQWRkUmVzb3VyY2UoJ3NmbnQnLCBzZWxmLnJlc19pZCwgc2VsZi5mdWxsbmFtZSkKKwkJcmVzLkNoYW5nZWRSZXNvdXJjZSgpCisJCQorCQlzZWxmLmNyZWF0ZUZvbmQoKQorCQlkZWwgc2VsZi50dEZvbnQKKwkJUmVzLkNsb3NlUmVzRmlsZShzZWxmLnJlc3JlZikKKwkJc2VsZi5maWxlLmNsb3NlKCkKKwkJc2VsZi5jbG9zZWQgPSAxCisJCisJZGVmIGNyZWF0ZUZvbmQoc2VsZik6CisJCWZvbmRfcmVzID0gUmVzLlJlc291cmNlKCIiKQorCQlmb25kX3Jlcy5BZGRSZXNvdXJjZSgnRk9ORCcsIHNlbGYucmVzX2lkLCBzZWxmLmZ1bGxuYW1lKQorCQkKKwkJZnJvbSBmb250VG9vbHMgaW1wb3J0IGZvbmRMaWIKKwkJZm9uZCA9IGZvbmRMaWIuRm9udEZhbWlseShmb25kX3JlcywgInciKQorCQkKKwkJZm9uZC5mZkZpcnN0Q2hhciA9IDAKKwkJZm9uZC5mZkxhc3RDaGFyID0gMjU1CisJCWZvbmQuZm9uZENsYXNzID0gMAorCQlmb25kLmZvbnRBc3NvYyA9IFsoMCwgMCwgc2VsZi5yZXNfaWQpXQorCQlmb25kLmZmRmxhZ3MgPSAyMDQ4MAkjIFhYWCA/Pz8KKwkJZm9uZC5mZkludGwgPSAoMCwgMCkKKwkJZm9uZC5mZkxlYWRpbmcgPSAwCisJCWZvbmQuZmZQcm9wZXJ0eSA9ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKQorCQlmb25kLmZmVmVyc2lvbiA9IDAKKwkJZm9uZC5nbHlwaEVuY29kaW5nID0ge30KKwkJaWYgc2VsZi5mYW1pbHluYW1lID09IHNlbGYucHNuYW1lOgorCQkJZm9uZC5zdHlsZUluZGljZXMgPSAoMSwpICogNDggICMgdWgtb2gsIGZvbmRMaWIgaXMgdG9vIGR1bWIuCisJCWVsc2U6CisJCQlmb25kLnN0eWxlSW5kaWNlcyA9ICgyLCkgKiA0OAorCQlmb25kLnN0eWxlU3RyaW5ncyA9IFtdCisJCWZvbmQuYm91bmRpbmdCb3hlcyA9IE5vbmUKKwkJZm9uZC5mZkZhbUlEID0gc2VsZi5yZXNfaWQKKwkJZm9uZC5jaGFuZ2VkID0gMQorCQlmb25kLmdseXBoVGFibGVPZmZzZXQgPSAwCisJCWZvbmQuc3R5bGVNYXBwaW5nUmVzZXJ2ZWQgPSAwCisJCQorCQkjIGNhbGM6CisJCXNjYWxlID0gNDA5Ni4wIC8gc2VsZi50dEZvbnRbJ2hlYWQnXS51bml0c1BlckVtCisJCWZvbmQuZmZBc2NlbnQgPSBzY2FsZSAqIHNlbGYudHRGb250WydoaGVhJ10uYXNjZW50CisJCWZvbmQuZmZEZXNjZW50ID0gc2NhbGUgKiBzZWxmLnR0Rm9udFsnaGhlYSddLmRlc2NlbnQKKwkJZm9uZC5mZldpZE1heCA9IHNjYWxlICogc2VsZi50dEZvbnRbJ2hoZWEnXS5hZHZhbmNlV2lkdGhNYXgKKwkJCisJCWZvbmQuZmZGYW1pbHlOYW1lID0gc2VsZi5mYW1pbHluYW1lCisJCWZvbmQucHNOYW1lcyA9IHswOiBzZWxmLnBzbmFtZX0KKwkJCisJCWZvbmQud2lkdGhUYWJsZXMgPSB7fQorCQlmb25kLmtlcm5UYWJsZXMgPSB7fQorCQljbWFwID0gc2VsZi50dEZvbnRbJ2NtYXAnXS5nZXRjbWFwKDEsIDApCisJCWlmIGNtYXA6CisJCQluYW1lcyA9IHt9CisJCQlmb3IgY29kZSwgbmFtZSBpbiBjbWFwLmNtYXAuaXRlbXMoKToKKwkJCQluYW1lc1tuYW1lXSA9IGNvZGUKKwkJCWlmIHNlbGYudHRGb250Lmhhc19rZXkoJ2tlcm4nKToKKwkJCQlrZXJuID0gc2VsZi50dEZvbnRbJ2tlcm4nXS5nZXRrZXJuKDApCisJCQkJaWYga2VybjoKKwkJCQkJZm9uZGtlcm5pbmcgPSBbXQorCQkJCQlmb3IgKGxlZnQsIHJpZ2h0KSwgdmFsdWUgaW4ga2Vybi5rZXJuVGFibGUuaXRlbXMoKToKKwkJCQkJCWlmIG5hbWVzLmhhc19rZXkobGVmdCkgYW5kIG5hbWVzLmhhc19rZXkocmlnaHQpOgorCQkJCQkJCWZvbmRrZXJuaW5nLmFwcGVuZCgobmFtZXNbbGVmdF0sIG5hbWVzW3JpZ2h0XSwgc2NhbGUgKiB2YWx1ZSkpCisJCQkJCWZvbmRrZXJuaW5nLnNvcnQoKQorCQkJCQlmb25kLmtlcm5UYWJsZXMgPSB7MDogZm9uZGtlcm5pbmd9CisJCQlpZiBzZWxmLnR0Rm9udC5oYXNfa2V5KCdobXR4Jyk6CisJCQkJaG10eCA9IHNlbGYudHRGb250WydobXR4J10KKwkJCQlmb25kd2lkdGhzID0gWzIwNDhdICogMjU2ICsgWzAsIDBdICAjIGRlZmF1bHQgd2lkdGgsICsgcGx1cyB0d28gemVyb3MuCisJCQkJZm9yIG5hbWUsICh3aWR0aCwgbHNiKSBpbiBobXR4Lm1ldHJpY3MuaXRlbXMoKToKKwkJCQkJaWYgbmFtZXMuaGFzX2tleShuYW1lKToKKwkJCQkJCWZvbmR3aWR0aHNbbmFtZXNbbmFtZV1dID0gc2NhbGUgKiB3aWR0aAorCQkJCWZvbmQud2lkdGhUYWJsZXMgPSB7MDogZm9uZHdpZHRoc30KKwkJZm9uZC5zYXZlKCkKKwkKKwlkZWYgX19kZWxfXyhzZWxmKToKKwkJaWYgbm90IHNlbGYuY2xvc2VkOgorCQkJc2VsZi5jbG9zZSgpCisJCisJZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorCQkjIGNoZWFwIGluaGVyaXRhbmNlCisJCXJldHVybiBnZXRhdHRyKHNlbGYuZmlsZSwgYXR0cikKKwkKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi9zZm50LnB5IGIvTGliL2ZvbnRUb29scy90dExpYi9zZm50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZGViOTkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3NmbnQucHkKQEAgLTAsMCArMSwyMzAgQEAKKyIiInR0TGliL3NmbnQucHkgLS0gbG93LWxldmVsIG1vZHVsZSB0byBkZWFsIHdpdGggdGhlIHNmbnQgZmlsZSBmb3JtYXQuCisKK0RlZmluZXMgdHdvIHB1YmxpYyBjbGFzc2VzOgorCVNGTlRSZWFkZXIKKwlTRk5UV3JpdGVyCisKKyhOb3JtYWxseSB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgdGhlc2UgY2xhc3NlcyBleHBsaWNpdGx5OyB0aGV5IGFyZSAKK3VzZWQgYXV0b21hdGljYWxseSBieSB0dExpYi5UVEZvbnQuKQorCitUaGUgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBzZm50IGZpbGVzIGlzIHNlcGFyYXRlZCBpbiB0d28gZGlzdGluY3QgCitjbGFzc2VzLCBzaW5jZSB3aGVuZXZlciB0byBudW1iZXIgb2YgdGFibGVzIGNoYW5nZXMgb3Igd2hlbmV2ZXIKK2EgdGFibGUncyBsZW5ndGggY2hhZ2VzIHlvdSBuZWVkIHRvIHJld3JpdGUgdGhlIHdob2xlIGZpbGUgYW55d2F5LgorIiIiCisKK2ltcG9ydCBzdHJ1Y3QsIHNzdHJ1Y3QKK2ltcG9ydCBOdW1lcmljCitpbXBvcnQgb3MKKworY2xhc3MgU0ZOVFJlYWRlcjoKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgY2hlY2tjaGVja3N1bXM9MSk6CisJCXNlbGYuZmlsZSA9IGZpbGUKKwkJc2VsZi5jaGVja2NoZWNrc3VtcyA9IGNoZWNrY2hlY2tzdW1zCisJCWRhdGEgPSBzZWxmLmZpbGUucmVhZChzZm50RGlyZWN0b3J5U2l6ZSkKKwkJaWYgbGVuKGRhdGEpIDw+IHNmbnREaXJlY3RvcnlTaXplOgorCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAiTm90IGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udCAobm90IGVub3VnaCBkYXRhKSIKKwkJc3N0cnVjdC51bnBhY2soc2ZudERpcmVjdG9yeUZvcm1hdCwgZGF0YSwgc2VsZikKKwkJaWYgc2VsZi5zZm50VmVyc2lvbiBub3QgaW4gKCJcMDAwXDAwMVwwMDBcMDAwIiwgIk9UVE8iLCAidHJ1ZSIpOgorCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAiTm90IGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udCAoYmFkIHNmbnRWZXJzaW9uKSIKKwkJc2VsZi50YWJsZXMgPSB7fQorCQlmb3IgaSBpbiByYW5nZShzZWxmLm51bVRhYmxlcyk6CisJCQllbnRyeSA9IFNGTlREaXJlY3RvcnlFbnRyeSgpCisJCQllbnRyeS5mcm9tZmlsZShzZWxmLmZpbGUpCisJCQlzZWxmLnRhYmxlc1tlbnRyeS50YWddID0gZW50cnkKKwkKKwlkZWYgaGFzX2tleShzZWxmLCB0YWcpOgorCQlyZXR1cm4gc2VsZi50YWJsZXMuaGFzX2tleSh0YWcpCisJCisJZGVmIGtleXMoc2VsZik6CisJCXJldHVybiBzZWxmLnRhYmxlcy5rZXlzKCkKKwkKKwlkZWYgX19nZXRpdGVtX18oc2VsZiwgdGFnKToKKwkJIiIiRmV0Y2ggdGhlIHJhdyB0YWJsZSBkYXRhLiIiIgorCQllbnRyeSA9IHNlbGYudGFibGVzW3RhZ10KKwkJc2VsZi5maWxlLnNlZWsoZW50cnkub2Zmc2V0KQorCQlkYXRhID0gc2VsZi5maWxlLnJlYWQoZW50cnkubGVuZ3RoKQorCQlpZiBzZWxmLmNoZWNrY2hlY2tzdW1zOgorCQkJaWYgdGFnID09ICdoZWFkJzoKKwkJCQkjIEJlaDogd2UgaGF2ZSB0byBzcGVjaWFsLWNhc2UgdGhlICdoZWFkJyB0YWJsZS4KKwkJCQljaGVja3N1bSA9IGNhbGNjaGVja3N1bShkYXRhWzo4XSArICdcMFwwXDBcMCcgKyBkYXRhWzEyOl0pCisJCQllbHNlOgorCQkJCWNoZWNrc3VtID0gY2FsY2NoZWNrc3VtKGRhdGEpCisJCQlpZiBzZWxmLmNoZWNrY2hlY2tzdW1zID4gMToKKwkJCQkjIEJlIG9ibm94aW91cywgYW5kIGJhcmYgd2hlbiBpdCdzIHdyb25nCisJCQkJYXNzZXJ0IGNoZWNrc3VtID09IGVudHJ5LmNoZWNrc3VtLCAiYmFkIGNoZWNrc3VtIGZvciAnJXMnIHRhYmxlIiAlIHRhZworCQkJZWxpZiBjaGVja3N1bSA8PiBlbnRyeS5jaGVja1N1bToKKwkJCQkjIEJlIGZyaWVuZGx5LCBhbmQganVzdCBwcmludCBhIHdhcm5pbmcuCisJCQkJcHJpbnQgImJhZCBjaGVja3N1bSBmb3IgJyVzJyB0YWJsZSIgJSB0YWcKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgY2xvc2Uoc2VsZik6CisJCXNlbGYuZmlsZS5jbG9zZSgpCisKKworY2xhc3MgU0ZOVFdyaXRlcjoKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgbnVtVGFibGVzLCBzZm50VmVyc2lvbj0iXDAwMFwwMDFcMDAwXDAwMCIpOgorCQlzZWxmLmZpbGUgPSBmaWxlCisJCXNlbGYubnVtVGFibGVzID0gbnVtVGFibGVzCisJCXNlbGYuc2ZudFZlcnNpb24gPSBzZm50VmVyc2lvbgorCQlzZWxmLnNlYXJjaFJhbmdlLCBzZWxmLmVudHJ5U2VsZWN0b3IsIHNlbGYucmFuZ2VTaGlmdCA9IGdldHNlYXJjaHJhbmdlKG51bVRhYmxlcykKKwkJc2VsZi5uZXh0VGFibGVPZmZzZXQgPSBzZm50RGlyZWN0b3J5U2l6ZSArIG51bVRhYmxlcyAqIHNmbnREaXJlY3RvcnlFbnRyeVNpemUKKwkJIyBjbGVhciBvdXQgZGlyZWN0b3J5IGFyZWEKKwkJc2VsZi5maWxlLnNlZWsoc2VsZi5uZXh0VGFibGVPZmZzZXQpCisJCSMgbWFrZSBzdXJlIHdlJ3JlIGFjdHVhbGx5IHdoZXJlIHdlIHdhbnQgdG8gYmUuIChYWFggb2xkIGNTdHJpbmdJTyBidWcpCisJCXNlbGYuZmlsZS53cml0ZSgnXDAnICogKHNlbGYubmV4dFRhYmxlT2Zmc2V0IC0gc2VsZi5maWxlLnRlbGwoKSkpCisJCXNlbGYudGFibGVzID0ge30KKwkKKwlkZWYgX19zZXRpdGVtX18oc2VsZiwgdGFnLCBkYXRhKToKKwkJIiIiV3JpdGUgcmF3IHRhYmxlIGRhdGEgdG8gZGlzay4iIiIKKwkJaWYgc2VsZi50YWJsZXMuaGFzX2tleSh0YWcpOgorCQkJIyBXZSd2ZSB3cml0dGVuIHRoaXMgdGFibGUgdG8gZmlsZSBiZWZvcmUuIElmIHRoZSBsZW5ndGgKKwkJCSMgb2YgdGhlIGRhdGEgaXMgc3RpbGwgdGhlIHNhbWUsIHdlIGFsbG93IG92ZXJ3cml0bmcgaXQuCisJCQllbnRyeSA9IHNlbGYudGFibGVzW3RhZ10KKwkJCWlmIGxlbihkYXRhKSA8PiBlbnRyeS5sZW5ndGg6CisJCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQkJcmFpc2UgdHRMaWIuVFRMaWJFcnJvciwgImNhbm5vdCByZXdyaXRlICclcycgdGFibGU6IGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBkaXJlY3RvcnkgZW50cnkiICUgdGFnCisJCWVsc2U6CisJCQllbnRyeSA9IFNGTlREaXJlY3RvcnlFbnRyeSgpCisJCQllbnRyeS50YWcgPSB0YWcKKwkJCWVudHJ5Lm9mZnNldCA9IHNlbGYubmV4dFRhYmxlT2Zmc2V0CisJCQllbnRyeS5sZW5ndGggPSBsZW4oZGF0YSkKKwkJCXNlbGYubmV4dFRhYmxlT2Zmc2V0ID0gc2VsZi5uZXh0VGFibGVPZmZzZXQgKyAoKGxlbihkYXRhKSArIDMpICYgfjMpCisJCXNlbGYuZmlsZS5zZWVrKGVudHJ5Lm9mZnNldCkKKwkJc2VsZi5maWxlLndyaXRlKGRhdGEpCisJCXNlbGYuZmlsZS5zZWVrKHNlbGYubmV4dFRhYmxlT2Zmc2V0KQorCQkjIG1ha2Ugc3VyZSB3ZSdyZSBhY3R1YWxseSB3aGVyZSB3ZSB3YW50IHRvIGJlLiAoWFhYIG9sZCBjU3RyaW5nSU8gYnVnKQorCQlzZWxmLmZpbGUud3JpdGUoJ1wwJyAqIChzZWxmLm5leHRUYWJsZU9mZnNldCAtIHNlbGYuZmlsZS50ZWxsKCkpKQorCQkKKwkJaWYgdGFnID09ICdoZWFkJzoKKwkJCWVudHJ5LmNoZWNrU3VtID0gY2FsY2NoZWNrc3VtKGRhdGFbOjhdICsgJ1wwXDBcMFwwJyArIGRhdGFbMTI6XSkKKwkJZWxzZToKKwkJCWVudHJ5LmNoZWNrU3VtID0gY2FsY2NoZWNrc3VtKGRhdGEpCisJCXNlbGYudGFibGVzW3RhZ10gPSBlbnRyeQorCQorCWRlZiBjbG9zZShzZWxmKToKKwkJIiIiQWxsIHRhYmxlcyBtdXN0IGhhdmUgYmVlbiB3cml0dGVuIHRvIGRpc2suIE5vdyB3cml0ZSB0aGUKKwkJZGlyZWN0b3J5LgorCQkiIiIKKwkJdGFibGVzID0gc2VsZi50YWJsZXMuaXRlbXMoKQorCQl0YWJsZXMuc29ydCgpCisJCWlmIGxlbih0YWJsZXMpIDw+IHNlbGYubnVtVGFibGVzOgorCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAid3JvbmcgbnVtYmVyIG9mIHRhYmxlczsgZXhwZWN0ZWQgJWQsIGZvdW5kICVkIiAlIChzZWxmLm51bVRhYmxlcywgbGVuKHRhYmxlcykpCisJCQorCQlkaXJlY3RvcnkgPSBzc3RydWN0LnBhY2soc2ZudERpcmVjdG9yeUZvcm1hdCwgc2VsZikKKwkJCisJCXNlbGYuZmlsZS5zZWVrKHNmbnREaXJlY3RvcnlTaXplKQorCQlmb3IgdGFnLCBlbnRyeSBpbiB0YWJsZXM6CisJCQlkaXJlY3RvcnkgPSBkaXJlY3RvcnkgKyBlbnRyeS50b3N0cmluZygpCisJCXNlbGYuY2FsY21hc3RlcmNoZWNrc3VtKGRpcmVjdG9yeSkKKwkJc2VsZi5maWxlLnNlZWsoMCkKKwkJc2VsZi5maWxlLndyaXRlKGRpcmVjdG9yeSkKKwkJc2VsZi5maWxlLmNsb3NlKCkKKwkKKwlkZWYgY2FsY21hc3RlcmNoZWNrc3VtKHNlbGYsIGRpcmVjdG9yeSk6CisJCSMgY2FsY3VsYXRlIGNoZWNrU3VtQWRqdXN0bWVudAorCQl0YWdzID0gc2VsZi50YWJsZXMua2V5cygpCisJCWNoZWNrc3VtcyA9IE51bWVyaWMuemVyb3MobGVuKHRhZ3MpKzEpCisJCWZvciBpIGluIHJhbmdlKGxlbih0YWdzKSk6CisJCQljaGVja3N1bXNbaV0gPSBzZWxmLnRhYmxlc1t0YWdzW2ldXS5jaGVja1N1bQorCQkKKwkJZGlyZWN0b3J5X2VuZCA9IHNmbnREaXJlY3RvcnlTaXplICsgbGVuKHNlbGYudGFibGVzKSAqIHNmbnREaXJlY3RvcnlFbnRyeVNpemUKKwkJYXNzZXJ0IGRpcmVjdG9yeV9lbmQgPT0gbGVuKGRpcmVjdG9yeSkKKwkJCisJCWNoZWNrc3Vtc1stMV0gPSBjYWxjY2hlY2tzdW0oZGlyZWN0b3J5KQorCQljaGVja3N1bSA9IE51bWVyaWMuYWRkLnJlZHVjZShjaGVja3N1bXMpCisJCSMgQmlib0FmYmEhCisJCWNoZWNrc3VtYWRqdXN0bWVudCA9IE51bWVyaWMuYXJyYXkoMHhiMWIwYWZiYSkgLSBjaGVja3N1bQorCQkjIHdyaXRlIHRoZSBjaGVja3N1bSB0byB0aGUgZmlsZQorCQlzZWxmLmZpbGUuc2VlayhzZWxmLnRhYmxlc1snaGVhZCddLm9mZnNldCArIDgpCisJCXNlbGYuZmlsZS53cml0ZShzdHJ1Y3QucGFjaygibCIsIGNoZWNrc3VtYWRqdXN0bWVudCkpCisJCQorCisjIC0tIHNmbnQgZGlyZWN0b3J5IGhlbHBlcnMgYW5kIGNydWZ0CisKK3NmbnREaXJlY3RvcnlGb3JtYXQgPSAiIiIKKwkJPiAjIGJpZyBlbmRpYW4KKwkJc2ZudFZlcnNpb246IAk0cworCQludW1UYWJsZXM6CQlICQkjIG51bWJlciBvZiB0YWJsZXMKKwkJc2VhcmNoUmFuZ2U6CUgJCSMgKG1heDIgPD0gbnVtVGFibGVzKSoxNgorCQllbnRyeVNlbGVjdG9yOglICQkjIGxvZzIobWF4MiA8PSBudW1UYWJsZXMpCisJCXJhbmdlU2hpZnQ6CQlICQkjIG51bVRhYmxlcyoxNi1zZWFyY2hSYW5nZQorIiIiCisKK3NmbnREaXJlY3RvcnlTaXplID0gc3N0cnVjdC5jYWxjc2l6ZShzZm50RGlyZWN0b3J5Rm9ybWF0KQorCitzZm50RGlyZWN0b3J5RW50cnlGb3JtYXQgPSAiIiIKKwkJPiAjIGJpZyBlbmRpYW4KKwkJdGFnOgkJNHMKKwkJY2hlY2tTdW06CWwKKwkJb2Zmc2V0OgkJbAorCQlsZW5ndGg6CQlsCisiIiIKKworc2ZudERpcmVjdG9yeUVudHJ5U2l6ZSA9IHNzdHJ1Y3QuY2FsY3NpemUoc2ZudERpcmVjdG9yeUVudHJ5Rm9ybWF0KQorCitjbGFzcyBTRk5URGlyZWN0b3J5RW50cnk6CisJCisJZGVmIGZyb21maWxlKHNlbGYsIGZpbGUpOgorCQlzc3RydWN0LnVucGFjayhzZm50RGlyZWN0b3J5RW50cnlGb3JtYXQsIAorCQkJCWZpbGUucmVhZChzZm50RGlyZWN0b3J5RW50cnlTaXplKSwgc2VsZikKKwkKKwlkZWYgZnJvbXN0cmluZyhzZWxmLCBzdHIpOgorCQlzc3RydWN0LnVucGFjayhzZm50RGlyZWN0b3J5RW50cnlGb3JtYXQsIHN0ciwgc2VsZikKKwkKKwlkZWYgdG9zdHJpbmcoc2VsZik6CisJCXJldHVybiBzc3RydWN0LnBhY2soc2ZudERpcmVjdG9yeUVudHJ5Rm9ybWF0LCBzZWxmKQorCQorCWRlZiBfX3JlcHJfXyhzZWxmKToKKwkJaWYgaGFzYXR0cihzZWxmLCAidGFnIik6CisJCQlyZXR1cm4gIjxTRk5URGlyZWN0b3J5RW50cnkgJyVzJyBhdCAleD4iICUgKHNlbGYudGFnLCBpZChzZWxmKSkKKwkJZWxzZToKKwkJCXJldHVybiAiPFNGTlREaXJlY3RvcnlFbnRyeSBhdCAleD4iICUgaWQoc2VsZikKKworCitkZWYgY2FsY2NoZWNrc3VtKGRhdGEsIHN0YXJ0PTApOgorCSIiIkNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gZm9yIGFuIGFyYml0cmFyeSBibG9jayBvZiBkYXRhLgorCU9wdGlvbmFsbHkgdGFrZXMgYSAnc3RhcnQnIGFyZ3VtZW50LCB3aGljaCBhbGxvd3MgeW91IHRvCisJY2FsY3VsYXRlIGEgY2hlY2tzdW0gaW4gY2h1bmtzIGJ5IGZlZWRpbmcgaXQgYSBwcmV2aW91cworCXJlc3VsdC4KKwkKKwlJZiB0aGUgZGF0YSBsZW5ndGggaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ciwgaXQgYXNzdW1lcworCWl0IGlzIHRvIGJlIHBhZGRlZCB3aXRoIG51bGwgYnl0ZS4gCisJIiIiCisJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJcmVtYWluZGVyID0gbGVuKGRhdGEpICUgNAorCWlmIHJlbWFpbmRlcjoKKwkJZGF0YSA9IGRhdGEgKyAnXDAnICogKDQtcmVtYWluZGVyKQorCWEgPSBOdW1lcmljLmZyb21zdHJpbmcoc3RydWN0LnBhY2soIj5sIiwgc3RhcnQpICsgZGF0YSwgTnVtZXJpYy5JbnQzMikKKwlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCWEgPSBhLmJ5dGVzd2FwcGVkKCkKKwlyZXR1cm4gTnVtZXJpYy5hZGQucmVkdWNlKGEpCisKKworZGVmIG1heHBvd2Vyb2Z0d28oeCk6CisJIiIiUmV0dXJuIHRoZSBoaWdoZXN0IGV4cG9uZW50IG9mIHR3bywgc28gdGhhdAorCSgyICoqIGV4cG9uZW50KSA8PSB4CisJIiIiCisJZXhwb25lbnQgPSAwCisJd2hpbGUgeDoKKwkJeCA9IHggPj4gMQorCQlleHBvbmVudCA9IGV4cG9uZW50ICsgMQorCXJldHVybiBleHBvbmVudCAtIDEKKworCitkZWYgZ2V0c2VhcmNocmFuZ2Uobik6CisJIiIiQ2FsY3VsYXRlIHNlYXJjaFJhbmdlLCBlbnRyeVNlbGVjdG9yLCByYW5nZVNoaWZ0IGZvciB0aGUKKwlzZm50IGRpcmVjdG9yeS4gJ24nIGlzIHRoZSBudW1iZXIgb2YgdGFibGVzLgorCSIiIgorCSMgVGhpcyBzdHVmZiBuZWVkcyB0byBiZSBzdG9yZWQgaW4gdGhlIGZpbGUsIGJlY2F1c2U/CisJaW1wb3J0IG1hdGgKKwlleHBvbmVudCA9IG1heHBvd2Vyb2Z0d28obikKKwlzZWFyY2hSYW5nZSA9ICgyICoqIGV4cG9uZW50KSAqIDE2CisJZW50cnlTZWxlY3RvciA9IGV4cG9uZW50CisJcmFuZ2VTaGlmdCA9IG4gKiAxNiAtIHNlYXJjaFJhbmdlCisJcmV0dXJuIHNlYXJjaFJhbmdlLCBlbnRyeVNlbGVjdG9yLCByYW5nZVNoaWZ0CisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvc3RhbmRhcmRHbHlwaE9yZGVyLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi9zdGFuZGFyZEdseXBoT3JkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmMmViNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvc3RhbmRhcmRHbHlwaE9yZGVyLnB5CkBAIC0wLDAgKzEsMjYzIEBACisjIFhYWCBpcyB0aGlzICpyZWFsbHkqIGNvcnJlY3Q/CisKK3N0YW5kYXJkR2x5cGhPcmRlciA9IFsKKwkiLm5vdGRlZiIsCQkJCSMgMCAKKwkiLm51bGwiLAkJCQkjIDEgCisJIm5vbm1hcmtpbmdyZXR1cm4iLAkJIyAyIAorCSJzcGFjZSIsCQkJCSMgMyAKKwkiZXhjbGFtIiwJCQkJIyA0IAorCSJxdW90ZWRibCIsCQkJCSMgNSAKKwkibnVtYmVyc2lnbiIsCQkJIyA2IAorCSJkb2xsYXIiLAkJCQkjIDcgCisJInBlcmNlbnQiLAkJCQkjIDggCisJImFtcGVyc2FuZCIsCQkJIyA5IAorCSJxdW90ZXNpbmdsZSIsCQkJIyAxMCAKKwkicGFyZW5sZWZ0IiwJCQkjIDExIAorCSJwYXJlbnJpZ2h0IiwJCQkjIDEyIAorCSJhc3RlcmlzayIsCQkJCSMgMTMgCisJInBsdXMiLAkJCQkJIyAxNCAKKwkiY29tbWEiLAkJCQkjIDE1IAorCSJoeXBoZW4iLAkJCQkjIDE2IAorCSJwZXJpb2QiLAkJCQkjIDE3IAorCSJzbGFzaCIsCQkJCSMgMTggCisJInplcm8iLAkJCQkJIyAxOSAKKwkib25lIiwJCQkJCSMgMjAgCisJInR3byIsCQkJCQkjIDIxIAorCSJ0aHJlZSIsCQkJCSMgMjIgCisJImZvdXIiLAkJCQkJIyAyMyAKKwkiZml2ZSIsCQkJCQkjIDI0IAorCSJzaXgiLAkJCQkJIyAyNSAKKwkic2V2ZW4iLAkJCQkjIDI2IAorCSJlaWdodCIsCQkJCSMgMjcgCisJIm5pbmUiLAkJCQkJIyAyOCAKKwkiY29sb24iLAkJCQkjIDI5IAorCSJzZW1pY29sb24iLAkJCSMgMzAgCisJImxlc3MiLAkJCQkJIyAzMSAKKwkiZXF1YWwiLAkJCQkjIDMyIAorCSJncmVhdGVyIiwJCQkJIyAzMyAKKwkicXVlc3Rpb24iLAkJCQkjIDM0IAorCSJhdCIsCQkJCQkjIDM1IAorCSJBIiwJCQkJCSMgMzYgCisJIkIiLAkJCQkJIyAzNyAKKwkiQyIsCQkJCQkjIDM4IAorCSJEIiwJCQkJCSMgMzkgCisJIkUiLAkJCQkJIyA0MCAKKwkiRiIsCQkJCQkjIDQxIAorCSJHIiwJCQkJCSMgNDIgCisJIkgiLAkJCQkJIyA0MyAKKwkiSSIsCQkJCQkjIDQ0IAorCSJKIiwJCQkJCSMgNDUgCisJIksiLAkJCQkJIyA0NiAKKwkiTCIsCQkJCQkjIDQ3IAorCSJNIiwJCQkJCSMgNDggCisJIk4iLAkJCQkJIyA0OSAKKwkiTyIsCQkJCQkjIDUwIAorCSJQIiwJCQkJCSMgNTEgCisJIlEiLAkJCQkJIyA1MiAKKwkiUiIsCQkJCQkjIDUzIAorCSJTIiwJCQkJCSMgNTQgCisJIlQiLAkJCQkJIyA1NSAKKwkiVSIsCQkJCQkjIDU2IAorCSJWIiwJCQkJCSMgNTcgCisJIlciLAkJCQkJIyA1OCAKKwkiWCIsCQkJCQkjIDU5IAorCSJZIiwJCQkJCSMgNjAgCisJIloiLAkJCQkJIyA2MSAKKwkiYnJhY2tldGxlZnQiLAkJCSMgNjIgCisJImJhY2tzbGFzaCIsCQkJIyA2MyAKKwkiYnJhY2tldHJpZ2h0IiwJCQkjIDY0IAorCSJhc2NpaWNpcmN1bSIsCQkJIyA2NSAKKwkidW5kZXJzY29yZSIsCQkJIyA2NiAKKwkiZ3JhdmUiLAkJCQkjIDY3IAorCSJhIiwJCQkJCSMgNjggCisJImIiLAkJCQkJIyA2OSAKKwkiYyIsCQkJCQkjIDcwIAorCSJkIiwJCQkJCSMgNzEgCisJImUiLAkJCQkJIyA3MiAKKwkiZiIsCQkJCQkjIDczIAorCSJnIiwJCQkJCSMgNzQgCisJImgiLAkJCQkJIyA3NSAKKwkiaSIsCQkJCQkjIDc2IAorCSJqIiwJCQkJCSMgNzcgCisJImsiLAkJCQkJIyA3OCAKKwkibCIsCQkJCQkjIDc5IAorCSJtIiwJCQkJCSMgODAgCisJIm4iLAkJCQkJIyA4MSAKKwkibyIsCQkJCQkjIDgyIAorCSJwIiwJCQkJCSMgODMgCisJInEiLAkJCQkJIyA4NCAKKwkiciIsCQkJCQkjIDg1IAorCSJzIiwJCQkJCSMgODYgCisJInQiLAkJCQkJIyA4NyAKKwkidSIsCQkJCQkjIDg4IAorCSJ2IiwJCQkJCSMgODkgCisJInciLAkJCQkJIyA5MCAKKwkieCIsCQkJCQkjIDkxIAorCSJ5IiwJCQkJCSMgOTIgCisJInoiLAkJCQkJIyA5MyAKKwkiYnJhY2VsZWZ0IiwJCQkjIDk0IAorCSJiYXIiLAkJCQkJIyA5NSAKKwkiYnJhY2VyaWdodCIsCQkJIyA5NiAKKwkiYXNjaWl0aWxkZSIsCQkJIyA5NyAKKwkiQWRpZXJlc2lzIiwJCQkjIDk4IAorCSJBcmluZyIsCQkJCSMgOTkgCisJIkNjZWRpbGxhIiwJCQkJIyAxMDAgCisJIkVhY3V0ZSIsCQkJCSMgMTAxIAorCSJOdGlsZGUiLAkJCQkjIDEwMiAKKwkiT2RpZXJlc2lzIiwJCQkjIDEwMyAKKwkiVWRpZXJlc2lzIiwJCQkjIDEwNCAKKwkiYWFjdXRlIiwJCQkJIyAxMDUgCisJImFncmF2ZSIsCQkJCSMgMTA2IAorCSJhY2lyY3VtZmxleCIsCQkJIyAxMDcgCisJImFkaWVyZXNpcyIsCQkJIyAxMDggCisJImF0aWxkZSIsCQkJCSMgMTA5IAorCSJhcmluZyIsCQkJCSMgMTEwIAorCSJjY2VkaWxsYSIsCQkJCSMgMTExIAorCSJlYWN1dGUiLAkJCQkjIDExMiAKKwkiZWdyYXZlIiwJCQkJIyAxMTMgCisJImVjaXJjdW1mbGV4IiwJCQkjIDExNCAKKwkiZWRpZXJlc2lzIiwJCQkjIDExNSAKKwkiaWFjdXRlIiwJCQkJIyAxMTYgCisJImlncmF2ZSIsCQkJCSMgMTE3IAorCSJpY2lyY3VtZmxleCIsCQkJIyAxMTggCisJImlkaWVyZXNpcyIsCQkJIyAxMTkgCisJIm50aWxkZSIsCQkJCSMgMTIwIAorCSJvYWN1dGUiLAkJCQkjIDEyMSAKKwkib2dyYXZlIiwJCQkJIyAxMjIgCisJIm9jaXJjdW1mbGV4IiwJCQkjIDEyMyAKKwkib2RpZXJlc2lzIiwJCQkjIDEyNCAKKwkib3RpbGRlIiwJCQkJIyAxMjUgCisJInVhY3V0ZSIsCQkJCSMgMTI2IAorCSJ1Z3JhdmUiLAkJCQkjIDEyNyAKKwkidWNpcmN1bWZsZXgiLAkJCSMgMTI4IAorCSJ1ZGllcmVzaXMiLAkJCSMgMTI5IAorCSJkYWdnZXIiLAkJCQkjIDEzMCAKKwkiZGVncmVlIiwJCQkJIyAxMzEgCisJImNlbnQiLAkJCQkJIyAxMzIgCisJInN0ZXJsaW5nIiwJCQkJIyAxMzMgCisJInNlY3Rpb24iLAkJCQkjIDEzNCAKKwkiYnVsbGV0IiwJCQkJIyAxMzUgCisJInBhcmFncmFwaCIsCQkJIyAxMzYgCisJImdlcm1hbmRibHMiLAkJCSMgMTM3IAorCSJyZWdpc3RlcmVkIiwJCQkjIDEzOCAKKwkiY29weXJpZ2h0IiwJCQkjIDEzOSAKKwkidHJhZGVtYXJrIiwJCQkjIDE0MCAKKwkiYWN1dGUiLAkJCQkjIDE0MSAKKwkiZGllcmVzaXMiLAkJCQkjIDE0MiAKKwkibm90ZXF1YWwiLAkJCQkjIDE0MyAKKwkiQUUiLAkJCQkJIyAxNDQgCisJIk9zbGFzaCIsCQkJCSMgMTQ1IAorCSJpbmZpbml0eSIsCQkJCSMgMTQ2IAorCSJwbHVzbWludXMiLAkJCSMgMTQ3IAorCSJsZXNzZXF1YWwiLAkJCSMgMTQ4IAorCSJncmVhdGVyZXF1YWwiLAkJCSMgMTQ5IAorCSJ5ZW4iLAkJCQkJIyAxNTAgCisJIm11IiwJCQkJCSMgMTUxIAorCSJwYXJ0aWFsZGlmZiIsCQkJIyAxNTIgCisJInN1bW1hdGlvbiIsCQkJIyAxNTMgCisJInByb2R1Y3QiLAkJCQkjIDE1NCAKKwkicGkiLAkJCQkJIyAxNTUgCisJImludGVncmFsIiwJCQkJIyAxNTYgCisJIm9yZGZlbWluaW5lIiwJCQkjIDE1NyAKKwkib3JkbWFzY3VsaW5lIiwJCQkjIDE1OCAKKwkiT21lZ2EiLAkJCQkjIDE1OSAKKwkiYWUiLAkJCQkJIyAxNjAgCisJIm9zbGFzaCIsCQkJCSMgMTYxIAorCSJxdWVzdGlvbmRvd24iLAkJCSMgMTYyIAorCSJleGNsYW1kb3duIiwJCQkjIDE2MyAKKwkibG9naWNhbG5vdCIsCQkJIyAxNjQgCisJInJhZGljYWwiLAkJCQkjIDE2NSAKKwkiZmxvcmluIiwJCQkJIyAxNjYgCisJImFwcHJveGVxdWFsIiwJCQkjIDE2NyAKKwkiRGVsdGEiLAkJCQkjIDE2OCAKKwkiZ3VpbGxlbW90bGVmdCIsCQkjIDE2OSAKKwkiZ3VpbGxlbW90cmlnaHQiLAkJIyAxNzAgCisJImVsbGlwc2lzIiwJCQkJIyAxNzEgCisJIm5vbmJyZWFraW5nc3BhY2UiLAkJIyAxNzIgCisJIkFncmF2ZSIsCQkJCSMgMTczIAorCSJBdGlsZGUiLAkJCQkjIDE3NCAKKwkiT3RpbGRlIiwJCQkJIyAxNzUgCisJIk9FIiwJCQkJCSMgMTc2IAorCSJvZSIsCQkJCQkjIDE3NyAKKwkiZW5kYXNoIiwJCQkJIyAxNzggCisJImVtZGFzaCIsCQkJCSMgMTc5IAorCSJxdW90ZWRibGxlZnQiLAkJCSMgMTgwIAorCSJxdW90ZWRibHJpZ2h0IiwJCSMgMTgxIAorCSJxdW90ZWxlZnQiLAkJCSMgMTgyIAorCSJxdW90ZXJpZ2h0IiwJCQkjIDE4MyAKKwkiZGl2aWRlIiwJCQkJIyAxODQgCisJImxvemVuZ2UiLAkJCQkjIDE4NSAKKwkieWRpZXJlc2lzIiwJCQkjIDE4NiAKKwkiWWRpZXJlc2lzIiwJCQkjIDE4NyAKKwkiZnJhY3Rpb24iLAkJCQkjIDE4OAorCSJjdXJyZW5jeSIsCQkJCSMgMTg5CisJImd1aWxzaW5nbGxlZnQiLAkJIyAxOTAgCisJImd1aWxzaW5nbHJpZ2h0IiwJCSMgMTkxIAorCSJmaSIsCQkJCQkjIDE5MiAKKwkiZmwiLAkJCQkJIyAxOTMgCisJImRhZ2dlcmRibCIsCQkJIyAxOTQgCisJInBlcmlvZGNlbnRlcmVkIiwJCSMgMTk1IAorCSJxdW90ZXNpbmdsYmFzZSIsCQkjIDE5NiAKKwkicXVvdGVkYmxiYXNlIiwJCQkjIDE5NyAKKwkicGVydGhvdXNhbmQiLAkJCSMgMTk4IAorCSJBY2lyY3VtZmxleCIsCQkJIyAxOTkgCisJIkVjaXJjdW1mbGV4IiwJCQkjIDIwMCAKKwkiQWFjdXRlIiwJCQkJIyAyMDEgCisJIkVkaWVyZXNpcyIsCQkJIyAyMDIgCisJIkVncmF2ZSIsCQkJCSMgMjAzIAorCSJJYWN1dGUiLAkJCQkjIDIwNCAKKwkiSWNpcmN1bWZsZXgiLAkJCSMgMjA1IAorCSJJZGllcmVzaXMiLAkJCSMgMjA2IAorCSJJZ3JhdmUiLAkJCQkjIDIwNyAKKwkiT2FjdXRlIiwJCQkJIyAyMDggCisJIk9jaXJjdW1mbGV4IiwJCQkjIDIwOSAKKwkiYXBwbGUiLAkJCQkjIDIxMCAKKwkiT2dyYXZlIiwJCQkJIyAyMTEgCisJIlVhY3V0ZSIsCQkJCSMgMjEyIAorCSJVY2lyY3VtZmxleCIsCQkJIyAyMTMgCisJIlVncmF2ZSIsCQkJCSMgMjE0IAorCSJkb3RsZXNzaSIsCQkJCSMgMjE1IAorCSJjaXJjdW1mbGV4IiwJCQkjIDIxNiAKKwkidGlsZGUiLAkJCQkjIDIxNyAKKwkibWFjcm9uIiwJCQkJIyAyMTggCisJImJyZXZlIiwJCQkJIyAyMTkgCisJImRvdGFjY2VudCIsCQkJIyAyMjAgCisJInJpbmciLAkJCQkJIyAyMjEgCisJImNlZGlsbGEiLAkJCQkjIDIyMiAKKwkiaHVuZ2FydW1sYXV0IiwJCQkjIDIyMyAKKwkib2dvbmVrIiwJCQkJIyAyMjQgCisJImNhcm9uIiwJCQkJIyAyMjUgCisJIkxzbGFzaCIsCQkJCSMgMjI2IAorCSJsc2xhc2giLAkJCQkjIDIyNyAKKwkiU2Nhcm9uIiwJCQkJIyAyMjggCisJInNjYXJvbiIsCQkJCSMgMjI5IAorCSJaY2Fyb24iLAkJCQkjIDIzMCAKKwkiemNhcm9uIiwJCQkJIyAyMzEgCisJImJyb2tlbmJhciIsCQkJIyAyMzIgCisJIkV0aCIsCQkJCQkjIDIzMyAKKwkiZXRoIiwJCQkJCSMgMjM0IAorCSJZYWN1dGUiLAkJCQkjIDIzNSAKKwkieWFjdXRlIiwJCQkJIyAyMzYgCisJIlRob3JuIiwJCQkJIyAyMzcgCisJInRob3JuIiwJCQkJIyAyMzggCisJIm1pbnVzIiwJCQkJIyAyMzkgCisJIm11bHRpcGx5IiwJCQkJIyAyNDAgCisJIm9uZXN1cGVyaW9yIiwJCQkjIDI0MSAKKwkidHdvc3VwZXJpb3IiLAkJCSMgMjQyIAorCSJ0aHJlZXN1cGVyaW9yIiwJCSMgMjQzIAorCSJvbmVoYWxmIiwJCQkJIyAyNDQgCisJIm9uZXF1YXJ0ZXIiLAkJCSMgMjQ1IAorCSJ0aHJlZXF1YXJ0ZXJzIiwJCSMgMjQ2IAorCSJmcmFuYyIsCQkJCSMgMjQ3IAorCSJHYnJldmUiLAkJCQkjIDI0OCAKKwkiZ2JyZXZlIiwJCQkJIyAyNDkgCisJIklkb3RhY2NlbnQiLAkJCSMgMjUwIAorCSJTY2VkaWxsYSIsCQkJCSMgMjUxIAorCSJzY2VkaWxsYSIsCQkJCSMgMjUyIAorCSJDYWN1dGUiLAkJCQkjIDI1MyAKKwkiY2FjdXRlIiwJCQkJIyAyNTQgCisJIkNjYXJvbiIsCQkJCSMgMjU1IAorCSJjY2Fyb24iLAkJCQkjIDI1NiAKKwkiZGNyb2F0IgkJCQkjIDI1NyAKK10KKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvQ19GX0ZfLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvQ19GX0ZfLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDhmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9DX0ZfRl8ucHkKQEAgLTAsMCArMSwzNSBAQAoraW1wb3J0IERlZmF1bHRUYWJsZQorZnJvbSBmb250VG9vbHMgaW1wb3J0IGNmZkxpYgorCisKK2NsYXNzIHRhYmxlX0NfRl9GXyhEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlLCBjZmZMaWIuQ0ZGRm9udFNldCk6CisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHRhZyk6CisJCURlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUuX19pbml0X18oc2VsZiwgdGFnKQorCQljZmZMaWIuQ0ZGRm9udFNldC5fX2luaXRfXyhzZWxmKQorCQlzZWxmLl9nYXZlR2x5cGhPcmRlciA9IDAKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIG90Rm9udCk6CisJCXNlbGYuZGF0YSA9IGRhdGEgICMgWFhYIHdoaWxlIHdvcmsgaXMgaW4gcHJvZ3Jlc3MuLi4KKwkJY2ZmTGliLkNGRkZvbnRTZXQuZGVjb21waWxlKHNlbGYsIGRhdGEpCisJCWFzc2VydCBsZW4oc2VsZi5mb250cykgPT0gMSwgImNhbid0IGRlYWwgd2l0aCBtdWx0aS1mb250IENGRiB0YWJsZXMuIgorCQorCSNkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCSMJeHh4CisJCisJZGVmIGdldEdseXBoT3JkZXIoc2VsZik6CisJCWlmIHNlbGYuX2dhdmVHbHlwaE9yZGVyOgorCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAiaWxsZWdhbCB1c2Ugb2YgZ2V0R2x5cGhPcmRlcigpIgorCQlzZWxmLl9nYXZlR2x5cGhPcmRlciA9IDEKKwkJcmV0dXJuIHNlbGYuZm9udHNbc2VsZi5mb250TmFtZXNbMF1dLmdldEdseXBoT3JkZXIoKQorCQorCWRlZiBzZXRHbHlwaE9yZGVyKHNlbGYsIGdseXBoT3JkZXIpOgorCQlzZWxmLmZvbnRzW3NlbGYuZm9udE5hbWVzWzBdXS5zZXRHbHlwaE9yZGVyKGdseXBoT3JkZXIpCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgb3RGb250LCBwcm9ncmVzcz1Ob25lKToKKwkJY2ZmTGliLkNGRkZvbnRTZXQudG9YTUwoc2VsZiwgd3JpdGVyLCBwcm9ncmVzcykKKwkKKwkjZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgb3RGb250KToKKwkjCXh4eAorCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9EX1NfSV9HXy5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL0RfU19JX0dfLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTU2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9EX1NfSV9HXy5weQpAQCAtMCwwICsxLDEyIEBACitpbXBvcnQgRGVmYXVsdFRhYmxlCisKK2NsYXNzIHRhYmxlX0RfU19JX0dfKERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIHR0Rm9udCk6CisJCXhtbFdyaXRlci5jb21tZW50KCJub3RlIHRoYXQgdGhlIERpZ2l0YWwgU2lnbmF0dXJlIHdpbGwgYmUgaW52YWxpZCBhZnRlciByZWNvbXBpbGF0aW9uISIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkJeG1sV3JpdGVyLmJlZ2ludGFnKCJoZXhkYXRhIikKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQl4bWxXcml0ZXIuZHVtcGhleChzZWxmLmNvbXBpbGUodHRGb250KSkKKwkJeG1sV3JpdGVyLmVuZHRhZygiaGV4ZGF0YSIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL0RlZmF1bHRUYWJsZS5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL0RlZmF1bHRUYWJsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDVmMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvRGVmYXVsdFRhYmxlLnB5CkBAIC0wLDAgKzEsMzYgQEAKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKKworY2xhc3MgRGVmYXVsdFRhYmxlOgorCQorCWRlcGVuZGVuY2llcyA9IFtdCisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHRhZyk6CisJCXNlbGYudGFibGVUYWcgPSB0YWcKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIHR0Rm9udCk6CisJCXNlbGYuZGF0YSA9IGRhdGEKKwkKKwlkZWYgY29tcGlsZShzZWxmLCB0dEZvbnQpOgorCQlyZXR1cm4gc2VsZi5kYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJd3JpdGVyLmJlZ2ludGFnKCJoZXhkYXRhIikKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQl3cml0ZXIuZHVtcGhleChzZWxmLmNvbXBpbGUodHRGb250KSkKKwkJd3JpdGVyLmVuZHRhZygiaGV4ZGF0YSIpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgcmVhZEhleAorCQlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwkJaWYgbmFtZSA8PiAiaGV4ZGF0YSI6CisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAiY2FuJ3QgaGFuZGxlICclcycgZWxlbWVudCIgJSBuYW1lCisJCXNlbGYuZGVjb21waWxlKHJlYWRIZXgoY29udGVudCksIHR0Rm9udCkKKwkKKwlkZWYgX19yZXByX18oc2VsZik6CisJCXJldHVybiAiPCclcycgdGFibGUgYXQgJXg+IiAlIChzZWxmLnRhYmxlVGFnLCBpZChzZWxmKSkKKwkKKwlkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisJCXJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL0dfUF9PX1NfLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvR19QX09fU18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlYzg4NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL0dfUF9PX1NfLnB5CkBAIC0wLDAgKzEsMjk0IEBACitpbXBvcnQgb3RDb21tb24KKworCitjbGFzcyB0YWJsZV9HX1BfT19TXyhvdENvbW1vbi5iYXNlX0dQT1NfR1NVQik6CisJCisJZGVmIGdldExvb2t1cFR5cGVDbGFzcyhzZWxmLCBsb29rdXBUeXBlKToKKwkJcmV0dXJuIGxvb2t1cFR5cGVDbGFzc2VzW2xvb2t1cFR5cGVdCisKKworY2xhc3MgU2luZ2xlUG9zOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlwYXNzCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisJCisJZGVmIHRvWE1MKHNlbGYsIHhtbFdyaXRlciwgb3RGb250KToKKwkJeG1sV3JpdGVyLmNvbW1lbnQoIlhYWCIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkJCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIG90Rm9udCk6CisJCXh4eAorCisKK2NsYXNzIFBhaXJQb3M6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXNlbGYuZm9ybWF0ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlpZiBzZWxmLmZvcm1hdCA9PSAxOgorCQkJc2VsZi5kZWNvbXBpbGVGb3JtYXQxKHJlYWRlciwgb3RGb250KQorCQllbGlmIHNlbGYuZm9ybWF0ID09IDI6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDIocmVhZGVyLCBvdEZvbnQpCisJCWVsc2U6CisJCQlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJ1bmtub3duIFBhaXJQb3MgZm9ybWF0OiAlZCIgJSBzZWxmLmZvcm1hdAorCQorCWRlZiBkZWNvbXBpbGVGb3JtYXQxKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJY292ZXJhZ2UgPSByZWFkZXIucmVhZFRhYmxlKG90Q29tbW9uLkNvdmVyYWdlVGFibGUsIG90Rm9udCkKKwkJZ2x5cGhOYW1lcyA9IGNvdmVyYWdlLmdseXBoTmFtZXMKKwkJdmFsdWVGYWN0b3J5MSA9IFZhbHVlUmVjb3JkRmFjdG9yeShyZWFkZXIucmVhZFVTaG9ydCgpKQorCQl2YWx1ZUZhY3RvcnkyID0gVmFsdWVSZWNvcmRGYWN0b3J5KHJlYWRlci5yZWFkVVNob3J0KCkpCisJCXNlbGYucGFpcnMgPSBwYWlycyA9IHt9CisJCWZvciBpIGluIHJhbmdlKHJlYWRlci5yZWFkVVNob3J0KCkpOgorCQkJZmlyc3RHbHlwaE5hbWUgPSBnbHlwaE5hbWVzW2ldCisJCQlvZmZzZXQgPSByZWFkZXIucmVhZE9mZnNldCgpCisJCQlzZXREYXRhID0gcmVhZGVyLmdldFN1YlN0cmluZyhvZmZzZXQpCisJCQlzZXQgPSBQYWlyU2V0KCkKKwkJCXNldC5kZWNvbXBpbGUoc2V0RGF0YSwgb3RGb250LCB2YWx1ZUZhY3RvcnkxLCB2YWx1ZUZhY3RvcnkyKQorCQkJcGFpcnNbZmlyc3RHbHlwaE5hbWVdID0gc2V0LnZhbHVlcworCQorCWRlZiBkZWNvbXBpbGVGb3JtYXQyKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJY292ZXJhZ2UgPSByZWFkZXIucmVhZFRhYmxlKG90Q29tbW9uLkNvdmVyYWdlVGFibGUsIG90Rm9udCkKKwkJZ2x5cGhOYW1lcyA9IGNvdmVyYWdlLmdseXBoTmFtZXMKKwkJdmFsdWVGYWN0b3J5MSA9IFZhbHVlUmVjb3JkRmFjdG9yeShyZWFkZXIucmVhZFVTaG9ydCgpKQorCQl2YWx1ZUZhY3RvcnkyID0gVmFsdWVSZWNvcmRGYWN0b3J5KHJlYWRlci5yZWFkVVNob3J0KCkpCisJCXNlbGYuY2xhc3NEZWYxID0gcmVhZGVyLnJlYWRUYWJsZShvdENvbW1vbi5DbGFzc0RlZmluaXRpb25UYWJsZSwgb3RGb250KQorCQlzZWxmLmNsYXNzRGVmMiA9IHJlYWRlci5yZWFkVGFibGUob3RDb21tb24uQ2xhc3NEZWZpbml0aW9uVGFibGUsIG90Rm9udCkKKwkJY2xhc3MxQ291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWNsYXNzMkNvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLnBhaXJzID0gcGFpcnMgPSB7fSAgIyBzcGFyc2UgbWF0cml4CisJCWZvciBpIGluIHJhbmdlKGNsYXNzMUNvdW50KToKKwkJCXJvdyA9IHt9CisJCQlmb3IgaiBpbiByYW5nZShjbGFzczJDb3VudCk6CisJCQkJdmFsdWUxID0gdmFsdWVGYWN0b3J5MS5nZXRWYWx1ZVJlY29yZChyZWFkZXIpCisJCQkJdmFsdWUyID0gdmFsdWVGYWN0b3J5Mi5nZXRWYWx1ZVJlY29yZChyZWFkZXIpCisJCQkJaWYgdmFsdWUxIG9yIHZhbHVlMjoKKwkJCQkJcm93W2pdID0gKHZhbHVlMSwgdmFsdWUyKQorCQkJaWYgcm93OgorCQkJCXBhaXJzW2ldID0gcm93CisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisJCisJZGVmIHRvWE1MKHNlbGYsIHhtbFdyaXRlciwgb3RGb250KToKKwkJaWYgc2VsZi5mb3JtYXQgPT0gMToKKwkJCXNlbGYudG9YTUxGb3JtYXQxKHhtbFdyaXRlciwgb3RGb250KQorCQllbGlmIHNlbGYuZm9ybWF0ID09IDI6CisJCQlzZWxmLnRvWE1MRm9ybWF0Mih4bWxXcml0ZXIsIG90Rm9udCkKKwkJZWxzZToKKwkJCWZyb20gZm9udFRvb2xzIGltcG9ydCB0dExpYgorCQkJcmFpc2UgdHRMaWIuVFRMaWJFcnJvciwgInVua25vd24gUGFpclBvcyBmb3JtYXQ6ICVkIiAlIHNlbGYuZm9ybWF0CisJCisJZGVmIHRvWE1MRm9ybWF0MShzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCXBhaXJzID0gc2VsZi5wYWlycy5pdGVtcygpCisJCXBhaXJzLnNvcnQoKQorCQlmb3IgZmlyc3RHbHlwaCwgc2Vjb25kR2x5cGhzIGluIHBhaXJzOgorCQkJZm9yIHNlY29uZEdseXBoLCB2YWx1ZTEsIHZhbHVlMiBpbiBzZWNvbmRHbHlwaHM6CisJCQkJI1hYWFhYWFhYWAorCQkJCXhtbFdyaXRlci5iZWdpbnRhZygiUGFpciIsIGZpcnN0PWZpcnN0R2x5cGgsIHNlY29uZD1zZWNvbmRHbHlwaCkKKwkJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQkJaWYgdmFsdWUxOgorCQkJCQl2YWx1ZTEudG9YTUwoeG1sV3JpdGVyLCBvdEZvbnQpCisJCQkJaWYgdmFsdWUyOgorCQkJCQl2YWx1ZTIudG9YTUwoeG1sV3JpdGVyLCBvdEZvbnQpCisJCQkJeG1sV3JpdGVyLmVuZHRhZygiUGFpciIpCisJCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQorCWRlZiB0b1hNTEZvcm1hdDIoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQl4bWxXcml0ZXIuY29tbWVudCgiWFhYIikKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIG90Rm9udCk6CisJCXh4eAorCisKK2NsYXNzIFBhaXJTZXQ6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCwgdmFsdWVGYWN0b3J5MSwgdmFsdWVGYWN0b3J5Mik6CisJCXBhaXJWYWx1ZUNvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLnZhbHVlcyA9IHZhbHVlcyA9IFtdCisJCWZvciBqIGluIHJhbmdlKHBhaXJWYWx1ZUNvdW50KToKKwkJCXNlY29uZEdseXBoSUQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCQlzZWNvbmRHbHlwaE5hbWUgPSBvdEZvbnQuZ2V0R2x5cGhOYW1lKHNlY29uZEdseXBoSUQpCisJCQl2YWx1ZTEgPSB2YWx1ZUZhY3RvcnkxLmdldFZhbHVlUmVjb3JkKHJlYWRlcikKKwkJCXZhbHVlMiA9IHZhbHVlRmFjdG9yeTIuZ2V0VmFsdWVSZWNvcmQocmVhZGVyKQorCQkJdmFsdWVzLmFwcGVuZCgoc2Vjb25kR2x5cGhOYW1lLCB2YWx1ZTEsIHZhbHVlMikpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisKKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjCisKK2NsYXNzIEN1cnNpdmVQb3M6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXBhc3MKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQl4eHgKKwkKKwlkZWYgdG9YTUwoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQl4bWxXcml0ZXIuY29tbWVudCgiWFhYIikKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCisKK2NsYXNzIE1hcmtCYXNlUG9zOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlwYXNzCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisJCisJZGVmIHRvWE1MKHNlbGYsIHhtbFdyaXRlciwgb3RGb250KToKKwkJeG1sV3JpdGVyLmNvbW1lbnQoIlhYWCIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKworCitjbGFzcyBNYXJrTGlnUG9zOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlwYXNzCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisJCisJZGVmIHRvWE1MKHNlbGYsIHhtbFdyaXRlciwgb3RGb250KToKKwkJeG1sV3JpdGVyLmNvbW1lbnQoIlhYWCIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKworCitjbGFzcyBNYXJrTWFya1BvczoKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJcGFzcworCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCXh4eAorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCXhtbFdyaXRlci5jb21tZW50KCJYWFgiKQorCQl4bWxXcml0ZXIubmV3bGluZSgpCisKKworY2xhc3MgQ29udGV4dFBvczoKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJcGFzcworCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCXh4eAorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCXhtbFdyaXRlci5jb21tZW50KCJYWFgiKQorCQl4bWxXcml0ZXIubmV3bGluZSgpCisKKworY2xhc3MgQ2hhaW5Db250ZXh0UG9zOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlwYXNzCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisJCisJZGVmIHRvWE1MKHNlbGYsIHhtbFdyaXRlciwgb3RGb250KToKKwkJeG1sV3JpdGVyLmNvbW1lbnQoIlhYWCIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKworCitsb29rdXBUeXBlQ2xhc3NlcyA9IHsKKwkxOiBTaW5nbGVQb3MsCisJMjogUGFpclBvcywKKwkzOiBDdXJzaXZlUG9zLAorCTQ6IE1hcmtCYXNlUG9zLAorCTU6IE1hcmtMaWdQb3MsCisJNjogTWFya01hcmtQb3MsCisJNzogQ29udGV4dFBvcywKKwk4OiBDaGFpbkNvbnRleHRQb3MsCit9CisKKwordmFsdWVSZWNvcmRGb3JtYXQgPSBbCisjCU1hc2sJIE5hbWUJCSAgICAgc3RydWN0IGZvcm1hdCBjaGFyCisJKDB4MDAwMSwgIlhQbGFjZW1lbnQiLCAgICJoIiksCisJKDB4MDAwMiwgIllQbGFjZW1lbnQiLCAgICJoIiksCisJKDB4MDAwNCwgIlhBZHZhbmNlIiwgICAgICJoIiksCisJKDB4MDAwOCwgIllBZHZhbmNlIiwgICAgICJoIiksCisJKDB4MDAxMCwgIlhQbGFEZXZpY2UiLCAgICJIIiksCisJKDB4MDAyMCwgIllQbGFEZXZpY2UiLCAgICJIIiksCisJKDB4MDA0MCwgIlhBZHZEZXZpY2UiLCAgICJIIiksCisJKDB4MDA4MCwgIllBZHZEZXZpY2UiLCAgICJIIiksCisjIAlyZXNlcnZlZDoKKwkoMHgwMTAwLCAiUmVzZXJ2ZWQxIiwgICAgIkgiKSwKKwkoMHgwMjAwLCAiUmVzZXJ2ZWQyIiwgICAgIkgiKSwKKwkoMHgwNDAwLCAiUmVzZXJ2ZWQzIiwgICAgIkgiKSwKKwkoMHgwODAwLCAiUmVzZXJ2ZWQ0IiwgICAgIkgiKSwKKwkoMHgxMDAwLCAiUmVzZXJ2ZWQ1IiwgICAgIkgiKSwKKwkoMHgyMDAwLCAiUmVzZXJ2ZWQ2IiwgICAgIkgiKSwKKwkoMHg0MDAwLCAiUmVzZXJ2ZWQ3IiwgICAgIkgiKSwKKwkoMHg4MDAwLCAiUmVzZXJ2ZWQ4IiwgICAgIkgiKSwKK10KKworCitjbGFzcyBWYWx1ZVJlY29yZEZhY3Rvcnk6CisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlRm9ybWF0KToKKwkJZm9ybWF0ID0gIj4iCisJCW5hbWVzID0gW10KKwkJZm9yIG1hc2ssIG5hbWUsIGZvcm1hdENoYXIgaW4gdmFsdWVSZWNvcmRGb3JtYXQ6CisJCQlpZiB2YWx1ZUZvcm1hdCAmIG1hc2s6CisJCQkJbmFtZXMuYXBwZW5kKG5hbWUpCisJCQkJZm9ybWF0ID0gZm9ybWF0ICsgZm9ybWF0Q2hhcgorCQlzZWxmLm5hbWVzLCBzZWxmLmZvcm1hdCA9IG5hbWVzLCBmb3JtYXQKKwkJc2VsZi5zaXplID0gMiAqIGxlbihuYW1lcykKKwkKKwlkZWYgZ2V0VmFsdWVSZWNvcmQoc2VsZiwgcmVhZGVyKToKKwkJbmFtZXMgPSBzZWxmLm5hbWVzCisJCWlmIG5vdCBuYW1lczoKKwkJCXJldHVybiBOb25lCisJCXZhbHVlcyA9IHJlYWRlci5yZWFkU3RydWN0KHNlbGYuZm9ybWF0LCBzZWxmLnNpemUpCisJCXZhbHVlcyA9IG1hcChpbnQsIHZhbHVlcykKKwkJdmFsdWVSZWNvcmQgPSBWYWx1ZVJlY29yZCgpCisJCWl0ZW1zID0gbWFwKE5vbmUsIG5hbWVzLCB2YWx1ZXMpCisJCWZvciBuYW1lLCB2YWx1ZSBpbiBpdGVtczoKKwkJCXNldGF0dHIodmFsdWVSZWNvcmQsIG5hbWUsIHZhbHVlKQorCQlyZXR1cm4gdmFsdWVSZWNvcmQKKworCitjbGFzcyBWYWx1ZVJlY29yZDoKKwkjIHNlZSBWYWx1ZVJlY29yZEZhY3RvcnkKKwkKKwlkZWYgX19ub256ZXJvX18oc2VsZik6CisJCWZvciB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLnZhbHVlcygpOgorCQkJaWYgdmFsdWU6CisJCQkJcmV0dXJuIDEKKwkJcmV0dXJuIDAKKwkJCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCXNpbXBsZUl0ZW1zID0gW10KKwkJZm9yIG1hc2ssIG5hbWUsIGZvcm1hdCBpbiB2YWx1ZVJlY29yZEZvcm1hdFs6NF06ICAjICJzaW1wbGUiIHZhbHVlcworCQkJaWYgaGFzYXR0cihzZWxmLCBuYW1lKToKKwkJCQlzaW1wbGVJdGVtcy5hcHBlbmQoKG5hbWUsIGdldGF0dHIoc2VsZiwgbmFtZSkpKQorCQlkZXZpY2VJdGVtcyA9IFtdCisJCWZvciBtYXNrLCBuYW1lLCBmb3JtYXQgaW4gdmFsdWVSZWNvcmRGb3JtYXRbNDo4XTogICMgZGV2aWNlIHJlY29yZHMKKwkJCWlmIGhhc2F0dHIoc2VsZiwgbmFtZSk6CisJCQkJZGV2aWNlSXRlbXMuYXBwZW5kKChuYW1lLCBnZXRhdHRyKHNlbGYsIG5hbWUpKSkKKwkJaWYgZGV2aWNlSXRlbXM6CisJCQl4bWxXcml0ZXIuYmVnaW50YWcoIlZhbHVlUmVjb3JkIiwgc2ltcGxlSXRlbXMpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQlmb3IgbmFtZSwgZGV2aWNlUmVjb3JkIGluIGRldmljZUl0ZW1zOgorCQkJCXh4eAorCQkJeG1sV3JpdGVyLmVuZHRhZygiVmFsdWVSZWNvcmQiKQorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQllbHNlOgorCQkJeG1sV3JpdGVyLnNpbXBsZXRhZygiVmFsdWVSZWNvcmQiLCBzaW1wbGVJdGVtcykKKwkJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgX19yZXByX18oc2VsZik6CisJCXJldHVybiAiPFZhbHVlUmVjb3JkPiIKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvR19TX1VfQl8ucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9HX1NfVV9CXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM0ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvR19TX1VfQl8ucHkKQEAgLTAsMCArMSwyODMgQEAKK2ltcG9ydCBvdENvbW1vbgorCisKK2NsYXNzIHRhYmxlX0dfU19VX0JfKG90Q29tbW9uLmJhc2VfR1BPU19HU1VCKToKKwkKKwlkZWYgZ2V0TG9va3VwVHlwZUNsYXNzKHNlbGYsIGxvb2t1cFR5cGUpOgorCQlyZXR1cm4gbG9va3VwVHlwZUNsYXNzZXNbbG9va3VwVHlwZV0KKworCitjbGFzcyBTaW5nbGVTdWJzdDoKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJc2VsZi5mb3JtYXQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWlmIHNlbGYuZm9ybWF0ID09IDE6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDEocmVhZGVyLCBvdEZvbnQpCisJCWVsaWYgc2VsZi5mb3JtYXQgPT0gMjoKKwkJCXNlbGYuZGVjb21waWxlRm9ybWF0MihyZWFkZXIsIG90Rm9udCkKKwkJZWxzZToKKwkJCWZyb20gZm9udFRvb2xzIGltcG9ydCB0dExpYgorCQkJcmFpc2UgdHRMaWIuVFRMaWJFcnJvciwgInVua25vd24gU2luZ2xlU3ViIGZvcm1hdDogJWQiICUgc2VsZi5mb3JtYXQKKwkKKwlkZWYgZGVjb21waWxlRm9ybWF0MShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCWNvdmVyYWdlID0gcmVhZGVyLnJlYWRUYWJsZShvdENvbW1vbi5Db3ZlcmFnZVRhYmxlLCBvdEZvbnQpCisJCWdseXBoSURzID0gY292ZXJhZ2UuZ2V0R2x5cGhJRHMoKQorCQlnbHlwaE5hbWVzID0gY292ZXJhZ2UuZ2V0R2x5cGhOYW1lcygpCisJCXNlbGYuc3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnMgPSB7fQorCQlkZWx0YUdseXBoSUQgPSByZWFkZXIucmVhZFNob3J0KCkKKwkJZm9yIGkgaW4gcmFuZ2UobGVuKGdseXBoSURzKSk6CisJCQlpbnB1dCA9IGdseXBoTmFtZXNbaV0KKwkJCW91dHB1dCA9IG90Rm9udC5nZXRHbHlwaE5hbWUoZ2x5cGhJRHNbaV0gKyBkZWx0YUdseXBoSUQpCisJCQlzdWJzdGl0dXRpb25zW2lucHV0XSA9IG91dHB1dAorCQorCWRlZiBkZWNvbXBpbGVGb3JtYXQyKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJY292ZXJhZ2UgPSByZWFkZXIucmVhZFRhYmxlKG90Q29tbW9uLkNvdmVyYWdlVGFibGUsIG90Rm9udCkKKwkJZ2x5cGhOYW1lcyA9IGNvdmVyYWdlLmdldEdseXBoTmFtZXMoKQorCQlnbHlwaENvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLnN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zID0ge30KKwkJZm9yIGkgaW4gcmFuZ2UoZ2x5cGhDb3VudCk6CisJCQlnbHlwaElEID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQkJb3V0cHV0ID0gb3RGb250LmdldEdseXBoTmFtZShnbHlwaElEKQorCQkJaW5wdXQgPSBnbHlwaE5hbWVzW2ldCisJCQlzdWJzdGl0dXRpb25zW2lucHV0XSA9IG91dHB1dAorCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCXh4eAorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCXN1YnN0aXR1dGlvbnMgPSBzZWxmLnN1YnN0aXR1dGlvbnMuaXRlbXMoKQorCQlzdWJzdGl0dXRpb25zLnNvcnQoKQorCQlmb3IgaW5wdXQsIG91dHB1dCBpbiBzdWJzdGl0dXRpb25zOgorCQkJeG1sV3JpdGVyLnNpbXBsZXRhZygiU3Vic3QiLCBbKCJpbiIsIGlucHV0KSwgKCJvdXQiLCBvdXRwdXQpXSkKKwkJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCBvdEZvbnQpOgorCQl4eHgKKworCitjbGFzcyBNdWx0aXBsZVN1YnN0OgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlmb3JtYXQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWlmIGZvcm1hdCA8PiAxOgorCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAidW5rbm93biBNdWx0aXBsZVN1YnN0IGZvcm1hdDogJWQiICUgZm9ybWF0CisJCWdseXBoTmFtZXMgPSByZWFkZXIucmVhZFRhYmxlKG90Q29tbW9uLkNvdmVyYWdlVGFibGUsIG90Rm9udCkuZ2V0R2x5cGhOYW1lcygpCisJCXNlcXVlbmNlQ291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCXNlbGYuc3Vic3RpdHV0aW9ucyA9IHN1YnN0aXR1dGlvbnMgPSB7fQorCQlmb3IgaSBpbiByYW5nZShzZXF1ZW5jZUNvdW50KToKKwkJCXNlcXVlbmNlID0gcmVhZGVyLnJlYWRUYWJsZShTZXF1ZW5jZSwgb3RGb250KQorCQkJc3Vic3RpdHV0aW9uc1tnbHlwaE5hbWVzW2ldXSA9IHNlcXVlbmNlLmdseXBocworCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCXh4eAorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCWltcG9ydCBzdHJpbmcKKwkJaXRlbXMgPSBzZWxmLnN1YnN0aXR1dGlvbnMuaXRlbXMoKQorCQlpdGVtcy5zb3J0KCkKKwkJZm9yIGlucHV0LCBvdXRwdXQgaW4gaXRlbXM6CisJCQl4bWxXcml0ZXIuc2ltcGxldGFnKCJTdWJzdCIsIFsoImluIiwgaW5wdXQpLCAoIm91dCIsIHN0cmluZy5qb2luKG91dHB1dCwgIiwiKSldKQorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCisKK2NsYXNzIFNlcXVlbmNlOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlzZWxmLmdseXBocyA9IFtdCisJCWZvciBpIGluIHJhbmdlKHJlYWRlci5yZWFkVVNob3J0KCkpOgorCQkJc2VsZi5nbHlwaHMuYXBwZW5kKG90Rm9udC5nZXRHbHlwaE5hbWUocmVhZGVyLnJlYWRVU2hvcnQoKSkpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisKKworY2xhc3MgQWx0ZXJuYXRlU3Vic3Q6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCWZvcm1hdCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJaWYgZm9ybWF0IDw+IDE6CisJCQlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJ1bmtub3duIEFsdGVybmF0ZVN1YnN0IGZvcm1hdDogJWQiICUgZm9ybWF0CisJCWNvdmVyYWdlID0gcmVhZGVyLnJlYWRUYWJsZShvdENvbW1vbi5Db3ZlcmFnZVRhYmxlLCBvdEZvbnQpCisJCWdseXBoTmFtZXMgPSBjb3ZlcmFnZS5nZXRHbHlwaE5hbWVzKCkKKwkJYWx0ZXJuYXRlU2V0Q291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCXNlbGYuYWx0ZXJuYXRlU2V0ID0gYWx0ZXJuYXRlU2V0ID0ge30KKwkJZm9yIGkgaW4gcmFuZ2UoYWx0ZXJuYXRlU2V0Q291bnQpOgorCQkJc2V0ID0gcmVhZGVyLnJlYWRUYWJsZShBbHRlcm5hdGVTZXQsIG90Rm9udCkKKwkJCWFsdGVybmF0ZVNldFtnbHlwaE5hbWVzW2ldXSA9IHNldC5nbHlwaHMKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQl4eHgKKwkKKwlkZWYgdG9YTUwoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQlhbHRlcm5hdGVzID0gc2VsZi5hbHRlcm5hdGVTZXQuaXRlbXMoKQorCQlhbHRlcm5hdGVzLnNvcnQoKQorCQlmb3IgaW5wdXQsIHN1YnN0TGlzdCBpbiBhbHRlcm5hdGVzOgorCQkJeG1sV3JpdGVyLmJlZ2ludGFnKCJBbHRlcm5hdGVTZXQiLCBbKCJpbiIsIGlucHV0KV0pCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQlmb3Igb3V0cHV0IGluIHN1YnN0TGlzdDoKKwkJCQl4bWxXcml0ZXIuc2ltcGxldGFnKCJTdWJzdCIsIG91dD1vdXRwdXQpCisJCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQkJeG1sV3JpdGVyLmVuZHRhZygiQWx0ZXJuYXRlU2V0IikKKwkJCXhtbFdyaXRlci5uZXdsaW5lKCkKKworCitjbGFzcyBBbHRlcm5hdGVTZXQ6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCWdseXBoQ291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWdseXBoSURzID0gcmVhZGVyLnJlYWRVU2hvcnRBcnJheShnbHlwaENvdW50KQorCQlzZWxmLmdseXBocyA9IG1hcChvdEZvbnQuZ2V0R2x5cGhOYW1lLCBnbHlwaElEcykKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQl4eHgKKworCitjbGFzcyBMaWdhdHVyZVN1YnN0OgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlmb3JtYXQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWlmIGZvcm1hdCA8PiAxOgorCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAidW5rbm93biBMaWdhdHVyZVN1YnN0IGZvcm1hdDogJWQiICUgZm9ybWF0CisJCWNvdmVyYWdlID0gcmVhZGVyLnJlYWRUYWJsZShvdENvbW1vbi5Db3ZlcmFnZVRhYmxlLCBvdEZvbnQpCisJCWdseXBoTmFtZXMgPSBjb3ZlcmFnZS5nZXRHbHlwaE5hbWVzKCkKKwkJbGlnU2V0Q291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCXNlbGYubGlnYXR1cmVzID0gbGlnYXR1cmVzID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UobGlnU2V0Q291bnQpOgorCQkJZmlyc3RHbHlwaCA9IGdseXBoTmFtZXNbaV0KKwkJCWxpZ1NldCA9IHJlYWRlci5yZWFkVGFibGUoTGlnYXR1cmVTZXQsIG90Rm9udCkKKwkJCWZvciBsaWdhdHVyZUdseXBoLCBjb21wb25lbnRzIGluIGxpZ1NldC5saWdhdHVyZXM6CisJCQkJbGlnYXR1cmVzLmFwcGVuZCgoKGZpcnN0R2x5cGgsKSArIHR1cGxlKGNvbXBvbmVudHMpKSwgbGlnYXR1cmVHbHlwaCkKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQl4eHgKKwkKKwlkZWYgdG9YTUwoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQlpbXBvcnQgc3RyaW5nCisJCWZvciBpbnB1dCwgb3V0cHV0IGluIHNlbGYubGlnYXR1cmVzOgorCQkJeG1sV3JpdGVyLnNpbXBsZXRhZygiU3Vic3QiLCBbKCJpbiIsIHN0cmluZy5qb2luKGlucHV0LCAiLCIpKSwgKCJvdXQiLCBvdXRwdXQpXSkKKwkJCXhtbFdyaXRlci5uZXdsaW5lKCkKKworCitjbGFzcyBMaWdhdHVyZVNldDoKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJbGlnYXR1cmVDb3VudCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJc2VsZi5saWdhdHVyZXMgPSBsaWdhdHVyZXMgPSBbXQorCQlmb3IgaSBpbiByYW5nZShsaWdhdHVyZUNvdW50KToKKwkJCWxpZyA9IHJlYWRlci5yZWFkVGFibGUoTGlnYXR1cmUsIG90Rm9udCkKKwkJCWxpZ2F0dXJlcy5hcHBlbmQoKGxpZy5saWdhdHVyZUdseXBoLCBsaWcuY29tcG9uZW50cykpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisKKworY2xhc3MgTGlnYXR1cmU6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXNlbGYubGlnYXR1cmVHbHlwaCA9IG90Rm9udC5nZXRHbHlwaE5hbWUocmVhZGVyLnJlYWRVU2hvcnQoKSkKKwkJY29tcENvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLmNvbXBvbmVudHMgPSBjb21wb25lbnRzID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UoY29tcENvdW50LTEpOgorCQkJY29tcG9uZW50cy5hcHBlbmQob3RGb250LmdldEdseXBoTmFtZShyZWFkZXIucmVhZFVTaG9ydCgpKSkKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQl4eHgKKworCitjbGFzcyBDb250ZXh0U3Vic3Q6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCWZvcm1hdCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJaWYgZm9ybWF0ID09IDE6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDEocmVhZGVyLCBvdEZvbnQpCisJCWVsaWYgZm9ybWF0ID09IDI6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDIocmVhZGVyLCBvdEZvbnQpCisJCWVsaWYgZm9ybWF0ID09IDM6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDMocmVhZGVyLCBvdEZvbnQpCisJCWVsc2U6CisJCQlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJ1bmtub3duIENvbnRleHRTdWJzdCBmb3JtYXQ6ICVkIiAlIGZvcm1hdAorCQorCWRlZiBkZWNvbXBpbGVGb3JtYXQxKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJeHh4CisJCisJZGVmIGRlY29tcGlsZUZvcm1hdDIoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQl4eHgKKwkKKwlkZWYgZGVjb21waWxlRm9ybWF0MyhzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCWdseXBoQ291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCXN1YnN0Q291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWNvdmVyYWdlID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UoZ2x5cGhDb3VudCk6CisJCQljb3ZlcmFnZS5hcHBlbmQocmVhZGVyLnJlYWRUYWJsZShvdENvbW1vbi5Db3ZlcmFnZVRhYmxlLCBvdEZvbnQpKQorCQlzZWxmLnN1YnN0aXR1dGlvbnMgPSBzdWJzdGl0dXRpb25zID0gW10KKwkJZm9yIGkgaW4gcmFuZ2Uoc3Vic3RDb3VudCk6CisJCQlsb29rdXBSZWNvcmQgPSBTdWJzdExvb2t1cFJlY29yZCgpCisJCQlsb29rdXBSZWNvcmQuZGVjb21waWxlKHJlYWRlciwgb3RGb250KQorCQkJc3Vic3RpdHV0aW9ucy5hcHBlbmQoKGNvdmVyYWdlW2ldLmdldEdseXBoTmFtZXMoKSwgbG9va3VwUmVjb3JkKSkKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQl4eHgKKwkKKwlkZWYgdG9YTUwoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQl4bWxXcml0ZXIuY29tbWVudCgiWFhYIikKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCisKK2NsYXNzIENoYWluQ29udGV4dFN1YnN0OgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlzZWxmLmZvcm1hdCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJaWYgc2VsZi5mb3JtYXQgPT0gMToKKwkJCXNlbGYuZGVjb21waWxlRm9ybWF0MShyZWFkZXIsIG90Rm9udCkKKwkJZWxpZiBzZWxmLmZvcm1hdCA9PSAyOgorCQkJc2VsZi5kZWNvbXBpbGVGb3JtYXQyKHJlYWRlciwgb3RGb250KQorCQllbGlmIHNlbGYuZm9ybWF0ID09IDM6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDMocmVhZGVyLCBvdEZvbnQpCisJCWVsc2U6CisJCQlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJ1bmtub3duIENoYWluQ29udGV4dFN1YnN0IGZvcm1hdDogJWQiICUgc2VsZi5mb3JtYXQKKwkKKwlkZWYgZGVjb21waWxlRm9ybWF0MShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXBhc3MKKwkKKwlkZWYgZGVjb21waWxlRm9ybWF0MihzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXBhc3MKKwkKKwlkZWYgZGVjb21waWxlRm9ybWF0MyhzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXBhc3MKKwkJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisJCisJZGVmIHRvWE1MKHNlbGYsIHhtbFdyaXRlciwgb3RGb250KToKKwkJeG1sV3JpdGVyLmNvbW1lbnQoIlhYWCIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKworCitsb29rdXBUeXBlQ2xhc3NlcyA9IHsKKwkxOiBTaW5nbGVTdWJzdCwKKwkyOiBNdWx0aXBsZVN1YnN0LAorCTM6IEFsdGVybmF0ZVN1YnN0LAorCTQ6IExpZ2F0dXJlU3Vic3QsCisJNTogQ29udGV4dFN1YnN0LAorCTY6IENoYWluQ29udGV4dFN1YnN0LAorfQorCisKKyMKKyMgU2hhcmVkIGNsYXNzZXMKKyMKKworY2xhc3MgU3Vic3RMb29rdXBSZWNvcmQ6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXNlbGYuc2VxdWVuY2VJbmRleCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJc2VsZi5sb29rdXBMaXN0SW5kZXggPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJeHh4CisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL0xfVF9TX0hfLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvTF9UX1NfSF8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3MDFkNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL0xfVF9TX0hfLnB5CkBAIC0wLDAgKzEsNTAgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBhcnJheQoraW1wb3J0IHN0cnVjdAorZnJvbSBmb250VG9vbHMubWlzYy50ZXh0VG9vbHMgaW1wb3J0IHNhZmVFdmFsCisKKyMgWFhYIEkndmUgbG93ZXJlZCB0aGUgc3RyaWN0bmVzcywgdG8gbWFrZSBzdXJlIEFwcGxlJ3Mgb3duIENoaWNhZ28KKyMgWFhYIGdldHMgdGhyb3VnaC4gVGhleSdyZSBsb29raW5nIGludG8gaXQsIEkgaG9wZSB0byByYWlzZSB0aGUgc3RhbmRhcmRzCisjIFhYWCBiYWNrIHRvIG5vcm1hbCBldmVudHVhbGx5LgorCitjbGFzcyB0YWJsZV9MX1RfU19IXyhEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKToKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIHR0Rm9udCk6CisJCXZlcnNpb24sIG51bUdseXBocyA9IHN0cnVjdC51bnBhY2soIj5ISCIsIGRhdGFbOjRdKQorCQlkYXRhID0gZGF0YVs0Ol0KKwkJYXNzZXJ0IHZlcnNpb24gPT0gMAorCQlhc3NlcnQgbGVuKGRhdGEpID09IG51bUdseXBocworCQkjIG91Y2g6IHRoZSBhc3NlcnRpb24gaXMgbm90IHRydWUgaW4gQ2hpY2FnbyEKKwkJI2Fzc2VydCBudW1HbHlwaHMgPT0gdHRGb250WydtYXhwJ10ubnVtR2x5cGhzCisJCXlQZWxzID0gYXJyYXkuYXJyYXkoIkIiKQorCQl5UGVscy5mcm9tc3RyaW5nKGRhdGEpCisJCXNlbGYueVBlbHMgPSB7fQorCQlmb3IgaSBpbiByYW5nZShudW1HbHlwaHMpOgorCQkJc2VsZi55UGVsc1t0dEZvbnQuZ2V0R2x5cGhOYW1lKGkpXSA9IHlQZWxzW2ldCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJdmVyc2lvbiA9IDAKKwkJbmFtZXMgPSBzZWxmLnlQZWxzLmtleXMoKQorCQludW1HbHlwaHMgPSBsZW4obmFtZXMpCisJCXlQZWxzID0gWzBdICogbnVtR2x5cGhzCisJCSMgb3VjaDogdGhlIGFzc2VydGlvbiBpcyBub3QgdHJ1ZSBpbiBDaGljYWdvIQorCQkjYXNzZXJ0IGxlbihzZWxmLnlQZWxzKSA9PSB0dEZvbnRbJ21heHAnXS5udW1HbHlwaHMgPT0gbnVtR2x5cGhzCisJCWZvciBuYW1lIGluIG5hbWVzOgorCQkJeVBlbHNbdHRGb250LmdldEdseXBoSUQobmFtZSldID0gc2VsZi55UGVsc1tuYW1lXQorCQl5UGVscyA9IGFycmF5LmFycmF5KCJCIiwgeVBlbHMpCisJCXJldHVybiBzdHJ1Y3QucGFjaygiPkhIIiwgdmVyc2lvbiwgbnVtR2x5cGhzKSArIHlQZWxzLnRvc3RyaW5nKCkKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQluYW1lcyA9IHNlbGYueVBlbHMua2V5cygpCisJCW5hbWVzLnNvcnQoKQorCQlmb3IgbmFtZSBpbiBuYW1lczoKKwkJCXdyaXRlci5zaW1wbGV0YWcoInlQZWwiLCBuYW1lPW5hbWUsIHZhbHVlPXNlbGYueVBlbHNbbmFtZV0pCisJCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJaWYgbm90IGhhc2F0dHIoc2VsZiwgInlQZWxzIik6CisJCQlzZWxmLnlQZWxzID0ge30KKwkJaWYgbmFtZSA8PiAieVBlbCI6CisJCQlyZXR1cm4gIyBpZ25vcmUgdW5rbm93biB0YWdzCisJCXNlbGYueVBlbHNbYXR0cnNbIm5hbWUiXV0gPSBzYWZlRXZhbChhdHRyc1sidmFsdWUiXSkKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvT19TXzJmXzIucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9PX1NfMmZfMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTgyNzVmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvT19TXzJmXzIucHkKQEAgLTAsMCArMSwxNjQgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBzc3RydWN0Citmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwsIG51bTJiaW5hcnksIGJpbmFyeTJudW0KKworIyBwYW5vc2UgY2xhc3NpZmljYXRpb24KKworcGFub3NlRm9ybWF0ID0gIiIiCisJYkZhbWlseVR5cGU6CQlCCisJYlNlcmlmU3R5bGU6CQlCCisJYldlaWdodDoJCQlCCisJYlByb3BvcnRpb246CQlCCisJYkNvbnRyYXN0OgkJCUIKKwliU3Ryb2tlVmFyaWF0aW9uOglCCisJYkFybVN0eWxlOgkJCUIKKwliTGV0dGVyRm9ybToJCUIKKwliTWlkbGluZToJCQlCCisJYlhIZWlnaHQ6CQkJQgorIiIiCisKK2NsYXNzIFBhbm9zZToKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQlmb3JtYXRzdHJpbmcsIG5hbWVzLCBmaXhlcyA9IHNzdHJ1Y3QuZ2V0Zm9ybWF0KHBhbm9zZUZvcm1hdCkKKwkJZm9yIG5hbWUgaW4gbmFtZXM6CisJCQl3cml0ZXIuc2ltcGxldGFnKG5hbWUsIHZhbHVlPWdldGF0dHIoc2VsZiwgbmFtZSkpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJc2V0YXR0cihzZWxmLCBuYW1lLCBzYWZlRXZhbChhdHRyc1sidmFsdWUiXSkpCisKKworIyAnc2ZudCcgT1MvMiBhbmQgV2luZG93cyBNZXRyaWNzIHRhYmxlIC0gJ09TLzInCisKK09TMl9mb3JtYXRfMCA9ICIiIgorCT4JIyBiaWcgZW5kaWFuCisJdmVyc2lvbjoJCQkJSAkJIyB2ZXJzaW9uCisJeEF2Z0NoYXJXaWR0aDoJCQloCQkjIGF2ZXJhZ2UgY2hhcmFjdGVyIHdpZHRoCisJdXNXZWlnaHRDbGFzczoJCQlICQkjIGRlZ3JlZSBvZiB0aGlja25lc3Mgb2Ygc3Ryb2tlcworCXVzV2lkdGhDbGFzczoJCQlICQkjIGFzcGVjdCByYXRpbworCWZzVHlwZToJCQkJCWgJCSMgdHlwZSBmbGFncworCXlTdWJzY3JpcHRYU2l6ZToJCWgJCSMgc3Vic2NyaXB0IGhvcml6b250YWwgZm9udCBzaXplCisJeVN1YnNjcmlwdFlTaXplOgkJaAkJIyBzdWJzY3JpcHQgdmVydGljYWwgZm9udCBzaXplCisJeVN1YnNjcmlwdFhPZmZzZXQ6CQloCQkjIHN1YnNjcmlwdCB4IG9mZnNldAorCXlTdWJzY3JpcHRZT2Zmc2V0OgkJaAkJIyBzdWJzY3JpcHQgeSBvZmZzZXQKKwl5U3VwZXJzY3JpcHRYU2l6ZToJCWgJCSMgc3VwZXJzY3JpcHQgaG9yaXpvbnRhbCBmb250IHNpemUKKwl5U3VwZXJzY3JpcHRZU2l6ZToJCWgJCSMgc3VwZXJzY3JpcHQgdmVydGljYWwgZm9udCBzaXplCisJeVN1cGVyc2NyaXB0WE9mZnNldDoJaAkJIyBzdXBlcnNjcmlwdCB4IG9mZnNldAorCXlTdXBlcnNjcmlwdFlPZmZzZXQ6CWgJCSMgc3VwZXJzY3JpcHQgeSBvZmZzZXQKKwl5U3RyaWtlb3V0U2l6ZToJCQloCQkjIHN0cmlrZW91dCBzaXplCisJeVN0cmlrZW91dFBvc2l0aW9uOgkJaAkJIyBzdHJpa2VvdXQgcG9zaXRpb24KKwlzRmFtaWx5Q2xhc3M6CQkJaAkJIyBmb250IGZhbWlseSBjbGFzcyBhbmQgc3ViY2xhc3MKKwlwYW5vc2U6IAkJCQkxMHMJCSMgcGFub3NlIGNsYXNzaWZpY2F0aW9uIG51bWJlcgorCXVsVW5pY29kZVJhbmdlMToJCWwJCSMgY2hhcmFjdGVyIHJhbmdlCisJdWxVbmljb2RlUmFuZ2UyOgkJbAkJIyBjaGFyYWN0ZXIgcmFuZ2UKKwl1bFVuaWNvZGVSYW5nZTM6CQlsCQkjIGNoYXJhY3RlciByYW5nZQorCXVsVW5pY29kZVJhbmdlNDoJCWwJCSMgY2hhcmFjdGVyIHJhbmdlCisJYWNoVmVuZElEOgkJCQk0cwkJIyBmb250IHZlbmRvciBpZGVudGlmaWNhdGlvbgorCWZzU2VsZWN0aW9uOgkJCUgJCSMgZm9udCBzZWxlY3Rpb24gZmxhZ3MKKwlmc0ZpcnN0Q2hhckluZGV4OgkJSAkJIyBmaXJzdCB1bmljb2RlIGNoYXJhY3RlciBpbmRleAorCWZzTGFzdENoYXJJbmRleDoJCUgJCSMgbGFzdCB1bmljb2RlIGNoYXJhY3RlciBpbmRleAorCXVzVHlwb0FzY2VuZGVyOgkJCUgJCSMgdHlwb2dyYXBoaWMgYXNjZW5kZXIKKwl1c1R5cG9EZXNjZW5kZXI6CQlICQkjIHR5cG9ncmFwaGljIGRlc2NlbmRlcgorCXVzVHlwb0xpbmVHYXA6CQkJSAkJIyB0eXBvZ3JhcGhpYyBsaW5lIGdhcAorCXVzV2luQXNjZW50OgkJCUgJCSMgV2luZG93cyBhc2NlbmRlcgorCXVzV2luRGVzY2VudDoJCQlICQkjIFdpbmRvd3MgZGVzY2VuZGVyCisiIiIKKworT1MyX2Zvcm1hdF8xX2FkZGl0aW9uID0gICIiIgorCXVsQ29kZVBhZ2VSYW5nZTE6CWwKKwl1bENvZGVQYWdlUmFuZ2UyOglsCQorIiIiCisKK09TMl9mb3JtYXRfMl9hZGRpdGlvbiA9ICBPUzJfZm9ybWF0XzFfYWRkaXRpb24gKyAiIiIKKwlzeEhlaWdodDoJCQloCisJc0NhcEhlaWdodDoJCQloCisJdXNEZWZhdWx0Q2hhcjoJCUgKKwl1c0JyZWFrQ2hhcjoJCUgKKwl1c01heENvbnRleDoJCUgKKyIiIgorCitiaWdlbmRpYW4gPSAiCT4JIyBiaWcgZW5kaWFuXG4iCisKK09TMl9mb3JtYXRfMSA9IE9TMl9mb3JtYXRfMCArIE9TMl9mb3JtYXRfMV9hZGRpdGlvbgorT1MyX2Zvcm1hdF8yID0gT1MyX2Zvcm1hdF8wICsgT1MyX2Zvcm1hdF8yX2FkZGl0aW9uCitPUzJfZm9ybWF0XzFfYWRkaXRpb24gPSBiaWdlbmRpYW4gKyBPUzJfZm9ybWF0XzFfYWRkaXRpb24KK09TMl9mb3JtYXRfMl9hZGRpdGlvbiA9IGJpZ2VuZGlhbiArIE9TMl9mb3JtYXRfMl9hZGRpdGlvbgorCisKK2NsYXNzIHRhYmxlX09fU18yZl8yKERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCSIiInRoZSBPUy8yIHRhYmxlIiIiCisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlkdW1teSwgZGF0YSA9IHNzdHJ1Y3QudW5wYWNrMihPUzJfZm9ybWF0XzAsIGRhdGEsIHNlbGYpCisJCWlmIHNlbGYudmVyc2lvbiA9PSAxOgorCQkJc3N0cnVjdC51bnBhY2soT1MyX2Zvcm1hdF8xX2FkZGl0aW9uLCBkYXRhLCBzZWxmKQorCQllbGlmIHNlbGYudmVyc2lvbiA9PSAyOgorCQkJc3N0cnVjdC51bnBhY2soT1MyX2Zvcm1hdF8yX2FkZGl0aW9uLCBkYXRhLCBzZWxmKQorCQllbGlmIHNlbGYudmVyc2lvbiA8PiAwOgorCQkJZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAidW5rbm93biBmb3JtYXQgZm9yIE9TLzIgdGFibGU6IHZlcnNpb24gJXMiICUgc2VsZi52ZXJzaW9uCisJCXNlbGYucGFub3NlID0gc3N0cnVjdC51bnBhY2socGFub3NlRm9ybWF0LCBzZWxmLnBhbm9zZSwgUGFub3NlKCkpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJcGFub3NlID0gc2VsZi5wYW5vc2UKKwkJc2VsZi5wYW5vc2UgPSBzc3RydWN0LnBhY2socGFub3NlRm9ybWF0LCBzZWxmLnBhbm9zZSkKKwkJaWYgc2VsZi52ZXJzaW9uID09IDA6CisJCQlkYXRhID0gc3N0cnVjdC5wYWNrKE9TMl9mb3JtYXRfMCwgc2VsZikKKwkJZWxpZiBzZWxmLnZlcnNpb24gPT0gMToKKwkJCWRhdGEgPSBzc3RydWN0LnBhY2soT1MyX2Zvcm1hdF8xLCBzZWxmKQorCQllbGlmIHNlbGYudmVyc2lvbiA9PSAyOgorCQkJZGF0YSA9IHNzdHJ1Y3QucGFjayhPUzJfZm9ybWF0XzIsIHNlbGYpCisJCWVsc2U6CisJCQlmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJ1bmtub3duIGZvcm1hdCBmb3IgT1MvMiB0YWJsZTogdmVyc2lvbiAlcyIgJSBzZWxmLnZlcnNpb24KKwkJc2VsZi5wYW5vc2UgPSBwYW5vc2UKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQlpZiBzZWxmLnZlcnNpb24gPT0gMToKKwkJCWZvcm1hdCA9IE9TMl9mb3JtYXRfMQorCQllbGlmIHNlbGYudmVyc2lvbiA9PSAyOgorCQkJZm9ybWF0ID0gT1MyX2Zvcm1hdF8yCisJCWVsc2U6CisJCQlmb3JtYXQgPSBPUzJfZm9ybWF0XzAKKwkJZm9ybWF0c3RyaW5nLCBuYW1lcywgZml4ZXMgPSBzc3RydWN0LmdldGZvcm1hdChmb3JtYXQpCisJCWZvciBuYW1lIGluIG5hbWVzOgorCQkJdmFsdWUgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCisJCQlpZiB0eXBlKHZhbHVlKSA9PSB0eXBlKDBMKToKKwkJCQl2YWx1ZSA9IGludCh2YWx1ZSkKKwkJCWlmIG5hbWU9PSJwYW5vc2UiOgorCQkJCXdyaXRlci5iZWdpbnRhZygicGFub3NlIikKKwkJCQl3cml0ZXIubmV3bGluZSgpCisJCQkJdmFsdWUudG9YTUwod3JpdGVyLCB0dEZvbnQpCisJCQkJd3JpdGVyLmVuZHRhZygicGFub3NlIikKKwkJCWVsaWYgbmFtZSBpbiAoInVsVW5pY29kZVJhbmdlMSIsICJ1bFVuaWNvZGVSYW5nZTIiLCAKKwkJCQkJInVsVW5pY29kZVJhbmdlMyIsICJ1bFVuaWNvZGVSYW5nZTQiLAorCQkJCQkidWxDb2RlUGFnZVJhbmdlMSIsICJ1bENvZGVQYWdlUmFuZ2UyIik6CisJCQkJd3JpdGVyLnNpbXBsZXRhZyhuYW1lLCB2YWx1ZT1udW0yYmluYXJ5KHZhbHVlKSkKKwkJCWVsaWYgbmFtZSBpbiAoImZzVHlwZSIsICJmc1NlbGVjdGlvbiIpOgorCQkJCXdyaXRlci5zaW1wbGV0YWcobmFtZSwgdmFsdWU9bnVtMmJpbmFyeSh2YWx1ZSwgMTYpKQorCQkJZWxpZiBuYW1lID09ICJhY2hWZW5kSUQiOgorCQkJCXdyaXRlci5zaW1wbGV0YWcobmFtZSwgdmFsdWU9cmVwcih2YWx1ZSlbMTotMV0pCisJCQllbHNlOgorCQkJCXdyaXRlci5zaW1wbGV0YWcobmFtZSwgdmFsdWU9dmFsdWUpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJaWYgbmFtZSA9PSAicGFub3NlIjoKKwkJCXNlbGYucGFub3NlID0gcGFub3NlID0gUGFub3NlKCkKKwkJCWZvciBlbGVtZW50IGluIGNvbnRlbnQ6CisJCQkJaWYgdHlwZShlbGVtZW50KSA9PSB0eXBlKCgpKToKKwkJCQkJcGFub3NlLmZyb21YTUwoZWxlbWVudCwgdHRGb250KQorCQllbGlmIG5hbWUgaW4gKCJ1bFVuaWNvZGVSYW5nZTEiLCAidWxVbmljb2RlUmFuZ2UyIiwgCisJCQkJInVsVW5pY29kZVJhbmdlMyIsICJ1bFVuaWNvZGVSYW5nZTQiLAorCQkJCSJ1bENvZGVQYWdlUmFuZ2UxIiwgInVsQ29kZVBhZ2VSYW5nZTIiLAorCQkJCSJmc1R5cGUiLCAiZnNTZWxlY3Rpb24iKToKKwkJCXNldGF0dHIoc2VsZiwgbmFtZSwgYmluYXJ5Mm51bShhdHRyc1sidmFsdWUiXSkpCisJCWVsaWYgbmFtZSA9PSAiYWNoVmVuZElEIjoKKwkJCXNldGF0dHIoc2VsZiwgbmFtZSwgc2FmZUV2YWwoIicnJyIgKyBhdHRyc1sidmFsdWUiXSArICInJyciKSkKKwkJZWxzZToKKwkJCXNldGF0dHIoc2VsZiwgbmFtZSwgc2FmZUV2YWwoYXR0cnNbInZhbHVlIl0pKQorCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX18wLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvVF9TX0lfXzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4ZDI5YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX18wLnB5CkBAIC0wLDAgKzEsNDUgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBzdHJ1Y3QKKwordHNpMEZvcm1hdCA9ICc+SEhsJworCitkZWYgZml4bG9uZ3MoKGdseXBoSUQsIHRleHRMZW5ndGgsIHRleHRPZmZzZXQpKToKKwlyZXR1cm4gaW50KGdseXBoSUQpLCBpbnQodGV4dExlbmd0aCksIHRleHRPZmZzZXQJCisKKworY2xhc3MgdGFibGVfVF9TX0lfXzAoRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJZGVwZW5kZW5jaWVzID0gWyJUU0kxIl0KKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIHR0Rm9udCk6CisJCW51bUdseXBocyA9IHR0Rm9udFsnbWF4cCddLm51bUdseXBocworCQlpbmRpY2VzID0gW10KKwkJc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSh0c2kwRm9ybWF0KQorCQlmb3IgaSBpbiByYW5nZShudW1HbHlwaHMgKyA1KToKKwkJCWdseXBoSUQsIHRleHRMZW5ndGgsIHRleHRPZmZzZXQgPSBmaXhsb25ncyhzdHJ1Y3QudW5wYWNrKHRzaTBGb3JtYXQsIGRhdGFbOnNpemVdKSkKKwkJCWluZGljZXMuYXBwZW5kKChnbHlwaElELCB0ZXh0TGVuZ3RoLCB0ZXh0T2Zmc2V0KSkKKwkJCWRhdGEgPSBkYXRhW3NpemU6XQorCQlhc3NlcnQgbGVuKGRhdGEpID09IDAKKwkJYXNzZXJ0IGluZGljZXNbLTVdID09ICgwWEZGRkUsIDAsIDB4QUJGQzFGMzQpLCAiYmFkIG1hZ2ljIG51bWJlciIKKwkJc2VsZi5pbmRpY2VzID0gaW5kaWNlc1s6LTVdCisJCXNlbGYuZXh0cmFfaW5kaWNlcyA9IGluZGljZXNbLTQ6XQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCWRhdGEgPSAiIgorCQlzaXplID0gc3RydWN0LmNhbGNzaXplKHRzaTBGb3JtYXQpCisJCWZvciBpbmRleCwgdGV4dExlbmd0aCwgdGV4dE9mZnNldCBpbiBzZWxmLmluZGljZXM6CisJCQlkYXRhID0gZGF0YSArIHN0cnVjdC5wYWNrKHRzaTBGb3JtYXQsIGluZGV4LCB0ZXh0TGVuZ3RoLCB0ZXh0T2Zmc2V0KQorCQlkYXRhID0gZGF0YSArIHN0cnVjdC5wYWNrKHRzaTBGb3JtYXQsIDBYRkZGRSwgMCwgMHhBQkZDMUYzNCkKKwkJZm9yIGluZGV4LCB0ZXh0TGVuZ3RoLCB0ZXh0T2Zmc2V0IGluIHNlbGYuZXh0cmFfaW5kaWNlczoKKwkJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2sodHNpMEZvcm1hdCwgaW5kZXgsIHRleHRMZW5ndGgsIHRleHRPZmZzZXQpCisJCXJldHVybiBkYXRhCisJCisJZGVmIHNldChzZWxmLCBpbmRpY2VzLCBleHRyYV9pbmRpY2VzKToKKwkJIyBnZXRzIGNhbGxlZCBieSAnVFNJMScgb3IgJ1RTSTMnCisJCXNlbGYuaW5kaWNlcyA9IGluZGljZXMKKwkJc2VsZi5leHRyYV9pbmRpY2VzID0gZXh0cmFfaW5kaWNlcworCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCXdyaXRlci5jb21tZW50KCJUaGlzIHRhYmxlIHdpbGwgYmUgY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIiKQorCQl3cml0ZXIubmV3bGluZSgpCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX18xLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvVF9TX0lfXzEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlNGUxNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX18xLnB5CkBAIC0wLDAgKzEsMTE2IEBACitpbXBvcnQgRGVmYXVsdFRhYmxlCitpbXBvcnQgc3RyaW5nCisKK2NsYXNzIHRhYmxlX1RfU19JX18xKERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCWV4dHJhcyA9IHsweGZmZmE6ICJwcGdtIiwgMHhmZmZiOiAiY3Z0IiwgMHhmZmZjOiAicmVzZXJ2ZWQiLCAweGZmZmQ6ICJmcGdtIn0KKwkKKwlpbmRleHRhYmxlID0gIlRTSTAiCisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlpbmRleHRhYmxlID0gdHRGb250W3NlbGYuaW5kZXh0YWJsZV0KKwkJc2VsZi5nbHlwaFByb2dyYW1zID0ge30KKwkJZm9yIGkgaW4gcmFuZ2UobGVuKGluZGV4dGFibGUuaW5kaWNlcykpOgorCQkJZ2x5cGhJRCwgdGV4dExlbmd0aCwgdGV4dE9mZnNldCA9IGluZGV4dGFibGUuaW5kaWNlc1tpXQorCQkJaWYgdGV4dExlbmd0aCA9PSAweDgwMDA6CisJCQkJIyBVZ2guIEhpIEJlYXQhCisJCQkJdGV4dExlbmd0aCA9IGluZGV4dGFibGUuaW5kaWNlc1tpKzFdWzFdCisJCQlpZiB0ZXh0TGVuZ3RoID4gMHg4MDAwOgorCQkJCXBhc3MgICMgWFhYIEhtbW0uCisJCQl0ZXh0ID0gZGF0YVt0ZXh0T2Zmc2V0OnRleHRPZmZzZXQrdGV4dExlbmd0aF0KKwkJCWFzc2VydCBsZW4odGV4dCkgPT0gdGV4dExlbmd0aAorCQkJaWYgdGV4dDoKKwkJCQlzZWxmLmdseXBoUHJvZ3JhbXNbdHRGb250LmdldEdseXBoTmFtZShnbHlwaElEKV0gPSB0ZXh0CisJCQorCQlzZWxmLmV4dHJhUHJvZ3JhbXMgPSB7fQorCQlmb3IgaSBpbiByYW5nZShsZW4oaW5kZXh0YWJsZS5leHRyYV9pbmRpY2VzKSk6CisJCQlleHRyYUNvZGUsIHRleHRMZW5ndGgsIHRleHRPZmZzZXQgPSBpbmRleHRhYmxlLmV4dHJhX2luZGljZXNbaV0KKwkJCWlmIHRleHRMZW5ndGggPT0gMHg4MDAwOgorCQkJCWlmIGV4dHJhTmFtZSA9PSAiZnBnbSI6CSMgdGhpcyBpcyB0aGUgbGFzdCBvbmUKKwkJCQkJdGV4dExlbmd0aCA9IGxlbihkYXRhKSAtIHRleHRPZmZzZXQKKwkJCQllbHNlOgorCQkJCQl0ZXh0TGVuZ3RoID0gaW5kZXh0YWJsZS5leHRyYV9pbmRpY2VzW2krMV1bMV0KKwkJCXRleHQgPSBkYXRhW3RleHRPZmZzZXQ6dGV4dE9mZnNldCt0ZXh0TGVuZ3RoXQorCQkJYXNzZXJ0IGxlbih0ZXh0KSA9PSB0ZXh0TGVuZ3RoCisJCQlpZiB0ZXh0OgorCQkJCXNlbGYuZXh0cmFQcm9ncmFtc1tzZWxmLmV4dHJhc1tleHRyYUNvZGVdXSA9IHRleHQKKwkKKwlkZWYgY29tcGlsZShzZWxmLCB0dEZvbnQpOgorCQlkYXRhID0gJycKKwkJaW5kZXh0YWJsZSA9IHR0Rm9udFtzZWxmLmluZGV4dGFibGVdCisJCWdseXBoTmFtZXMgPSB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpCisJCQorCQlpbmRpY2VzID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UobGVuKGdseXBoTmFtZXMpKToKKwkJCWlmIGxlbihkYXRhKSAlIDI6CisJCQkJZGF0YSA9IGRhdGEgKyAiXDAxNSIgICMgYWxpZ24gb24gMi1ieXRlIGJvdW5kYXJpZXMsIGZpbGwgd2l0aCByZXR1cm4gY2hhcnMuIFl1bS4KKwkJCW5hbWUgPSBnbHlwaE5hbWVzW2ldCisJCQlpZiBzZWxmLmdseXBoUHJvZ3JhbXMuaGFzX2tleShuYW1lKToKKwkJCQl0ZXh0ID0gc2VsZi5nbHlwaFByb2dyYW1zW25hbWVdCisJCQllbHNlOgorCQkJCXRleHQgPSAiIgorCQkJdGV4dExlbmd0aCA9IGxlbih0ZXh0KQorCQkJaWYgdGV4dExlbmd0aCA+PSAweDgwMDA6CisJCQkJdGV4dExlbmd0aCA9IDB4ODAwMCAgIyBYWFggPz8/CisJCQlpbmRpY2VzLmFwcGVuZCgoaSwgdGV4dExlbmd0aCwgbGVuKGRhdGEpKSkKKwkJCWRhdGEgPSBkYXRhICsgdGV4dAorCQkKKwkJZXh0cmFfaW5kaWNlcyA9IFtdCisJCWNvZGVzID0gc2VsZi5leHRyYXMuaXRlbXMoKQorCQljb2Rlcy5zb3J0KCkKKwkJZm9yIGkgaW4gcmFuZ2UobGVuKGNvZGVzKSk6CisJCQlpZiBsZW4oZGF0YSkgJSAyOgorCQkJCWRhdGEgPSBkYXRhICsgIlwwMTUiICAjIGFsaWduIG9uIDItYnl0ZSBib3VuZGFyaWVzLCBmaWxsIHdpdGggcmV0dXJuIGNoYXJzLgorCQkJY29kZSwgbmFtZSA9IGNvZGVzW2ldCisJCQlpZiBzZWxmLmV4dHJhUHJvZ3JhbXMuaGFzX2tleShuYW1lKToKKwkJCQl0ZXh0ID0gc2VsZi5leHRyYVByb2dyYW1zW25hbWVdCisJCQllbHNlOgorCQkJCXRleHQgPSAiIgorCQkJdGV4dExlbmd0aCA9IGxlbih0ZXh0KQorCQkJaWYgdGV4dExlbmd0aCA+PSAweDgwMDA6CisJCQkJdGV4dExlbmd0aCA9IDB4ODAwMCAgIyBYWFggPz8/CisJCQlleHRyYV9pbmRpY2VzLmFwcGVuZCgoY29kZSwgdGV4dExlbmd0aCwgbGVuKGRhdGEpKSkKKwkJCWRhdGEgPSBkYXRhICsgdGV4dAorCQlpbmRleHRhYmxlLnNldChpbmRpY2VzLCBleHRyYV9pbmRpY2VzKQorCQlyZXR1cm4gZGF0YQorCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCW5hbWVzID0gc2VsZi5nbHlwaFByb2dyYW1zLmtleXMoKQorCQluYW1lcy5zb3J0KCkKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQlmb3IgbmFtZSBpbiBuYW1lczoKKwkJCXRleHQgPSBzZWxmLmdseXBoUHJvZ3JhbXNbbmFtZV0KKwkJCWlmIG5vdCB0ZXh0OgorCQkJCWNvbnRpbnVlCisJCQl3cml0ZXIuYmVnaW50YWcoImdseXBoUHJvZ3JhbSIsIG5hbWU9bmFtZSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCXdyaXRlci53cml0ZV9ub2luZGVudChzdHJpbmcucmVwbGFjZSh0ZXh0LCAiXHIiLCAiXG4iKSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCXdyaXRlci5lbmR0YWcoImdseXBoUHJvZ3JhbSIpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCWV4dHJhX25hbWVzID0gc2VsZi5leHRyYVByb2dyYW1zLmtleXMoKQorCQlleHRyYV9uYW1lcy5zb3J0KCkKKwkJZm9yIG5hbWUgaW4gZXh0cmFfbmFtZXM6CisJCQl0ZXh0ID0gc2VsZi5leHRyYVByb2dyYW1zW25hbWVdCisJCQlpZiBub3QgdGV4dDoKKwkJCQljb250aW51ZQorCQkJd3JpdGVyLmJlZ2ludGFnKCJleHRyYVByb2dyYW0iLCBuYW1lPW5hbWUpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQl3cml0ZXIud3JpdGVfbm9pbmRlbnQoc3RyaW5nLnJlcGxhY2UodGV4dCwgIlxyIiwgIlxuIikpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQl3cml0ZXIuZW5kdGFnKCJleHRyYVByb2dyYW0iKQorCQkJd3JpdGVyLm5ld2xpbmUoKQorCQkJd3JpdGVyLm5ld2xpbmUoKQorCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIHR0Rm9udCk6CisJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJnbHlwaFByb2dyYW1zIik6CisJCQlzZWxmLmdseXBoUHJvZ3JhbXMgPSB7fQorCQkJc2VsZi5leHRyYVByb2dyYW1zID0ge30KKwkJbGluZXMgPSBzdHJpbmcuc3BsaXQoc3RyaW5nLnJlcGxhY2Uoc3RyaW5nLmpvaW4oY29udGVudCwgIiIpLCAiXHIiLCAiXG4iKSwgIlxuIikKKwkJdGV4dCA9IHN0cmluZy5qb2luKGxpbmVzWzE6LTFdLCAiXHIiKQorCQlpZiBuYW1lID09ICJnbHlwaFByb2dyYW0iOgorCQkJc2VsZi5nbHlwaFByb2dyYW1zW2F0dHJzWyJuYW1lIl1dID0gdGV4dAorCQllbGlmIG5hbWUgPT0gImV4dHJhUHJvZ3JhbSI6CisJCQlzZWxmLmV4dHJhUHJvZ3JhbXNbYXR0cnNbIm5hbWUiXV0gPSB0ZXh0CisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX18yLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvVF9TX0lfXzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjMDJhYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX18yLnB5CkBAIC0wLDAgKzEsOCBAQAorZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisKK3N1cGVyY2xhc3MgPSB0dExpYi5nZXRUYWJsZUNsYXNzKCJUU0kwIikKKworY2xhc3MgdGFibGVfVF9TX0lfXzIoc3VwZXJjbGFzcyk6CisJCisJZGVwZW5kZW5jaWVzID0gWyJUU0kzIl0KKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvVF9TX0lfXzMucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9UX1NfSV9fMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQwODdjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvVF9TX0lfXzMucHkKQEAgLTAsMCArMSwxMSBAQAorZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisKK3N1cGVyY2xhc3MgPSB0dExpYi5nZXRUYWJsZUNsYXNzKCJUU0kxIikKKworY2xhc3MgdGFibGVfVF9TX0lfXzMoc3VwZXJjbGFzcyk6CisJCisJZXh0cmFzID0gezB4ZmZmYTogInJlc2VydmVkMCIsIDB4ZmZmYjogInJlc2VydmVkMSIsIDB4ZmZmYzogInJlc2VydmVkMiIsIDB4ZmZmZDogInJlc2VydmVkMyJ9CisJCisJaW5kZXh0YWJsZSA9ICJUU0kyIgorCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX181LnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvVF9TX0lfXzUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViOWVlMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL1RfU19JX181LnB5CkBAIC0wLDAgKzEsNDIgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBhcnJheQorZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCitmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwKKworCitjbGFzcyB0YWJsZV9UX1NfSV9fNShEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKToKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIHR0Rm9udCk6CisJCW51bUdseXBocyA9IHR0Rm9udFsnbWF4cCddLm51bUdseXBocworCQlhc3NlcnQgbGVuKGRhdGEpID09IDIgKiBudW1HbHlwaHMKKwkJYSA9IGFycmF5LmFycmF5KCJIIikKKwkJYS5mcm9tc3RyaW5nKGRhdGEpCisJCWlmIHR0TGliLmVuZGlhbiA8PiAiYmlnIjoKKwkJCWEuYnl0ZXN3YXAoKQorCQlzZWxmLmdseXBoR3JvdXBpbmcgPSB7fQorCQlmb3IgaSBpbiByYW5nZShudW1HbHlwaHMpOgorCQkJc2VsZi5nbHlwaEdyb3VwaW5nW3R0Rm9udC5nZXRHbHlwaE5hbWUoaSldID0gYVtpXQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCWdseXBoTmFtZXMgPSB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpCisJCWEgPSBhcnJheS5hcnJheSgiSCIpCisJCWZvciBpIGluIHJhbmdlKGxlbihnbHlwaE5hbWVzKSk6CisJCQlhLmFwcGVuZChzZWxmLmdseXBoR3JvdXBpbmdbZ2x5cGhOYW1lc1tpXV0pCisJCWlmIHR0TGliLmVuZGlhbiA8PiAiYmlnIjoKKwkJCWEuYnl0ZXN3YXAoKQorCQlyZXR1cm4gYS50b3N0cmluZygpCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJbmFtZXMgPSBzZWxmLmdseXBoR3JvdXBpbmcua2V5cygpCisJCW5hbWVzLnNvcnQoKQorCQlmb3IgZ2x5cGhOYW1lIGluIG5hbWVzOgorCQkJd3JpdGVyLnNpbXBsZXRhZygiZ2x5cGhncm91cCIsIG5hbWU9Z2x5cGhOYW1lLCB2YWx1ZT1zZWxmLmdseXBoR3JvdXBpbmdbZ2x5cGhOYW1lXSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlpZiBub3QgaGFzYXR0cihzZWxmLCAiZ2x5cGhHcm91cGluZyIpOgorCQkJc2VsZi5nbHlwaEdyb3VwaW5nID0ge30KKwkJaWYgbmFtZSA8PiAiZ2x5cGhncm91cCI6CisJCQlyZXR1cm4KKwkJc2VsZi5nbHlwaEdyb3VwaW5nW2F0dHJzWyJuYW1lIl1dID0gc2FmZUV2YWwoYXR0cnNbInZhbHVlIl0pCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19faW5pdF9fLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxNzYzNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyMgZHVtbXkgZmlsZSwgc28gUHl0aG9uIGtub3dzIHR0TGliLnRhYmxlcyBpcyBhIHN1YnBhY2thZ2UKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19jX21fYV9wLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2NfbV9hX3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2N2FjNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19jX21fYV9wLnB5CkBAIC0wLDAgKzEsMzk3IEBACitpbXBvcnQgRGVmYXVsdFRhYmxlCitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3RyaW5nCitpbXBvcnQgYXJyYXkKK2Zyb20gZm9udFRvb2xzIGltcG9ydCB0dExpYgorZnJvbSBmb250VG9vbHMubWlzYy50ZXh0VG9vbHMgaW1wb3J0IHNhZmVFdmFsLCByZWFkSGV4CisKKworY2xhc3MgdGFibGVfX2NfbV9hX3AoRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJZGVmIGdldGNtYXAoc2VsZiwgcGxhdGZvcm1JRCwgcGxhdEVuY0lEKToKKwkJZm9yIHN1YnRhYmxlIGluIHNlbGYudGFibGVzOgorCQkJaWYgKHN1YnRhYmxlLnBsYXRmb3JtSUQgPT0gcGxhdGZvcm1JRCBhbmQgCisJCQkJCXN1YnRhYmxlLnBsYXRFbmNJRCA9PSBwbGF0RW5jSUQpOgorCQkJCXJldHVybiBzdWJ0YWJsZQorCQlyZXR1cm4gTm9uZSAjIG5vdCBmb3VuZAorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJdGFibGVWZXJzaW9uLCBudW1TdWJUYWJsZXMgPSBzdHJ1Y3QudW5wYWNrKCI+SEgiLCBkYXRhWzo0XSkKKwkJc2VsZi50YWJsZVZlcnNpb24gPSBpbnQodGFibGVWZXJzaW9uKQorCQlzZWxmLnRhYmxlcyA9IHRhYmxlcyA9IFtdCisJCWZvciBpIGluIHJhbmdlKG51bVN1YlRhYmxlcyk6CisJCQlwbGF0Zm9ybUlELCBwbGF0RW5jSUQsIG9mZnNldCA9IHN0cnVjdC51bnBhY2soCisJCQkJCSI+SEhsIiwgZGF0YVs0K2kqODo0KyhpKzEpKjhdKQorCQkJcGxhdGZvcm1JRCwgcGxhdEVuY0lEID0gaW50KHBsYXRmb3JtSUQpLCBpbnQocGxhdEVuY0lEKQorCQkJZm9ybWF0LCBsZW5ndGggPSBzdHJ1Y3QudW5wYWNrKCI+SEgiLCBkYXRhW29mZnNldDpvZmZzZXQrNF0pCisJCQlpZiBub3QgY21hcF9jbGFzc2VzLmhhc19rZXkoZm9ybWF0KToKKwkJCQl0YWJsZSA9IGNtYXBfZm9ybWF0X3Vua25vd24oZm9ybWF0KQorCQkJZWxzZToKKwkJCQl0YWJsZSA9IGNtYXBfY2xhc3Nlc1tmb3JtYXRdKGZvcm1hdCkKKwkJCXRhYmxlLnBsYXRmb3JtSUQgPSBwbGF0Zm9ybUlECisJCQl0YWJsZS5wbGF0RW5jSUQgPSBwbGF0RW5jSUQKKwkJCXRhYmxlLmRlY29tcGlsZShkYXRhW29mZnNldDpvZmZzZXQraW50KGxlbmd0aCldLCB0dEZvbnQpCisJCQl0YWJsZXMuYXBwZW5kKHRhYmxlKQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXNlbGYudGFibGVzLnNvcnQoKSAgICAjIHNvcnQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjOyBzZWUgQ21hcFN1YnRhYmxlLl9fY21wX18oKQorCQludW1TdWJUYWJsZXMgPSBsZW4oc2VsZi50YWJsZXMpCisJCXRvdGFsT2Zmc2V0ID0gNCArIDggKiBudW1TdWJUYWJsZXMKKwkJZGF0YSA9IHN0cnVjdC5wYWNrKCI+SEgiLCBzZWxmLnRhYmxlVmVyc2lvbiwgbnVtU3ViVGFibGVzKQorCQl0YWJsZURhdGEgPSAiIgorCQlkb25lID0ge30gICMgcmVtZW1iZXIgdGhlIGRhdGEgc28gd2UgY2FuIHJldXNlIHRoZSAicG9pbnRlcnMiCisJCWZvciB0YWJsZSBpbiBzZWxmLnRhYmxlczoKKwkJCWNodW5rID0gdGFibGUuY29tcGlsZSh0dEZvbnQpCisJCQlpZiBkb25lLmhhc19rZXkoY2h1bmspOgorCQkJCW9mZnNldCA9IGRvbmVbY2h1bmtdCisJCQllbHNlOgorCQkJCW9mZnNldCA9IGRvbmVbY2h1bmtdID0gdG90YWxPZmZzZXQgKyBsZW4odGFibGVEYXRhKQorCQkJdGFibGVEYXRhID0gdGFibGVEYXRhICsgY2h1bmsKKwkJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIj5ISGwiLCB0YWJsZS5wbGF0Zm9ybUlELCB0YWJsZS5wbGF0RW5jSUQsIG9mZnNldCkKKwkJcmV0dXJuIGRhdGEgKyB0YWJsZURhdGEKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQl3cml0ZXIuc2ltcGxldGFnKCJ0YWJsZVZlcnNpb24iLCB2ZXJzaW9uPXNlbGYudGFibGVWZXJzaW9uKQorCQl3cml0ZXIubmV3bGluZSgpCisJCWZvciB0YWJsZSBpbiBzZWxmLnRhYmxlczoKKwkJCXRhYmxlLnRvWE1MKHdyaXRlciwgdHRGb250KQorCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIHR0Rm9udCk6CisJCWlmIG5hbWUgPT0gInRhYmxlVmVyc2lvbiI6CisJCQlzZWxmLnRhYmxlVmVyc2lvbiA9IHNhZmVFdmFsKGF0dHJzWyJ2ZXJzaW9uIl0pCisJCQlyZXR1cm4KKwkJaWYgbmFtZVs6MTJdIDw+ICJjbWFwX2Zvcm1hdF8iOgorCQkJcmV0dXJuCisJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJ0YWJsZXMiKToKKwkJCXNlbGYudGFibGVzID0gW10KKwkJZm9ybWF0ID0gc2FmZUV2YWwobmFtZVsxMl0pCisJCWlmIG5vdCBjbWFwX2NsYXNzZXMuaGFzX2tleShmb3JtYXQpOgorCQkJdGFibGUgPSBjbWFwX2Zvcm1hdF91bmtub3duKGZvcm1hdCkKKwkJZWxzZToKKwkJCXRhYmxlID0gY21hcF9jbGFzc2VzW2Zvcm1hdF0oZm9ybWF0KQorCQl0YWJsZS5wbGF0Zm9ybUlEID0gc2FmZUV2YWwoYXR0cnNbInBsYXRmb3JtSUQiXSkKKwkJdGFibGUucGxhdEVuY0lEID0gc2FmZUV2YWwoYXR0cnNbInBsYXRFbmNJRCJdKQorCQl0YWJsZS5mcm9tWE1MKChuYW1lLCBhdHRycywgY29udGVudCksIHR0Rm9udCkKKwkJc2VsZi50YWJsZXMuYXBwZW5kKHRhYmxlKQorCisKK2NsYXNzIENtYXBTdWJ0YWJsZToKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0KToKKwkJc2VsZi5mb3JtYXQgPSBmb3JtYXQKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQl3cml0ZXIuYmVnaW50YWcoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIFsKKwkJCQkoInBsYXRmb3JtSUQiLCBzZWxmLnBsYXRmb3JtSUQpLAorCQkJCSgicGxhdEVuY0lEIiwgc2VsZi5wbGF0RW5jSUQpLAorCQkJCV0pCisJCXdyaXRlci5uZXdsaW5lKCkKKwkJd3JpdGVyLmR1bXBoZXgoc2VsZi5jb21waWxlKHR0Rm9udCkpCisJCXdyaXRlci5lbmR0YWcoc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZWxmLmRlY29tcGlsZShyZWFkSGV4KGNvbnRlbnQpLCB0dEZvbnQpCisJCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQkjIGltcGxlbWVudGVkIHNvIHRoYXQgbGlzdC5zb3J0KCkgc29ydHMgYWNjb3JkaW5nIHRvIHRoZSBjbWFwIHNwZWMuCisJCXNlbGZUdXBsZSA9ICgKKwkJCQkJc2VsZi5wbGF0Zm9ybUlELAorCQkJCQlzZWxmLnBsYXRFbmNJRCwKKwkJCQkJc2VsZi52ZXJzaW9uLAorCQkJCQlzZWxmLl9fZGljdF9fKQorCQlvdGhlclR1cGxlID0gKAorCQkJCQlvdGhlci5wbGF0Zm9ybUlELAorCQkJCQlvdGhlci5wbGF0RW5jSUQsCisJCQkJCW90aGVyLnZlcnNpb24sCisJCQkJCW90aGVyLl9fZGljdF9fKQorCQlyZXR1cm4gY21wKHNlbGZUdXBsZSwgb3RoZXJUdXBsZSkKKworCitjbGFzcyBjbWFwX2Zvcm1hdF8wKENtYXBTdWJ0YWJsZSk6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlmb3JtYXQsIGxlbmd0aCwgdmVyc2lvbiA9IHN0cnVjdC51bnBhY2soIj5ISEgiLCBkYXRhWzo2XSkKKwkJc2VsZi52ZXJzaW9uID0gaW50KHZlcnNpb24pCisJCWFzc2VydCBsZW4oZGF0YSkgPT0gMjYyID09IGxlbmd0aAorCQlnbHlwaElkQXJyYXkgPSBhcnJheS5hcnJheSgiQiIpCisJCWdseXBoSWRBcnJheS5mcm9tc3RyaW5nKGRhdGFbNjpdKQorCQlzZWxmLmNtYXAgPSBjbWFwID0ge30KKwkJZm9yIGNoYXJDb2RlIGluIHJhbmdlKGxlbihnbHlwaElkQXJyYXkpKToKKwkJCWNtYXBbY2hhckNvZGVdID0gdHRGb250LmdldEdseXBoTmFtZShnbHlwaElkQXJyYXlbY2hhckNvZGVdKQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCWNoYXJDb2RlcyA9IHNlbGYuY21hcC5rZXlzKCkKKwkJY2hhckNvZGVzLnNvcnQoKQorCQlhc3NlcnQgY2hhckNvZGVzID09IHJhbmdlKDI1NikgICMgY2hhckNvZGVzW2NoYXJDb2RlXSA9PSBjaGFyQ29kZQorCQlmb3IgY2hhckNvZGUgaW4gY2hhckNvZGVzOgorCQkJIyByZXVzaW5nIHRoZSBjaGFyQ29kZXMgbGlzdCEKKwkJCWNoYXJDb2Rlc1tjaGFyQ29kZV0gPSB0dEZvbnQuZ2V0R2x5cGhJRChzZWxmLmNtYXBbY2hhckNvZGVdKQorCQlnbHlwaElkQXJyYXkgPSBhcnJheS5hcnJheSgiQiIsIGNoYXJDb2RlcykKKwkJZGF0YSA9IHN0cnVjdC5wYWNrKCI+SEhIIiwgMCwgMjYyLCBzZWxmLnZlcnNpb24pICsgZ2x5cGhJZEFycmF5LnRvc3RyaW5nKCkKKwkJYXNzZXJ0IGxlbihkYXRhKSA9PSAyNjIKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQl3cml0ZXIuYmVnaW50YWcoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIFsKKwkJCQkoInBsYXRmb3JtSUQiLCBzZWxmLnBsYXRmb3JtSUQpLAorCQkJCSgicGxhdEVuY0lEIiwgc2VsZi5wbGF0RW5jSUQpLAorCQkJCSgidmVyc2lvbiIsIHNlbGYudmVyc2lvbiksCisJCQkJXSkKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQlpdGVtcyA9IHNlbGYuY21hcC5pdGVtcygpCisJCWl0ZW1zLnNvcnQoKQorCQlmb3IgY29kZSwgbmFtZSBpbiBpdGVtczoKKwkJCXdyaXRlci5zaW1wbGV0YWcoIm1hcCIsIGNvZGU9aGV4KGNvZGUpLCBuYW1lPW5hbWUpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCXdyaXRlci5lbmR0YWcoc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZWxmLnZlcnNpb24gPSBzYWZlRXZhbChhdHRyc1sidmVyc2lvbiJdKQorCQlzZWxmLmNtYXAgPSB7fQorCQlmb3IgZWxlbWVudCBpbiBjb250ZW50OgorCQkJaWYgdHlwZShlbGVtZW50KSA8PiB0eXBlKCgpKToKKwkJCQljb250aW51ZQorCQkJbmFtZSwgYXR0cnMsIGNvbnRlbnQgPSBlbGVtZW50CisJCQlpZiBuYW1lIDw+ICJtYXAiOgorCQkJCWNvbnRpbnVlCisJCQlzZWxmLmNtYXBbc2FmZUV2YWwoYXR0cnNbImNvZGUiXSldID0gYXR0cnNbIm5hbWUiXQorCQkJCisKKworY2xhc3MgY21hcF9mb3JtYXRfMihDbWFwU3VidGFibGUpOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJZm9ybWF0LCBsZW5ndGgsIHZlcnNpb24gPSBzdHJ1Y3QudW5wYWNrKCI+SEhIIiwgZGF0YVs6Nl0pCisJCXNlbGYudmVyc2lvbiA9IGludCh2ZXJzaW9uKQorCQlzZWxmLmRhdGEgPSBkYXRhCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJcmV0dXJuIHNlbGYuZGF0YQorCisKK2NtYXBfZm9ybWF0XzRfZm9ybWF0ID0gIj43SCIKKworI3VpbnQxNgllbmRDb2RlW3NlZ0NvdW50XQkJCSMgRW5kaW5nIGNoYXJhY3RlciBjb2RlIGZvciBlYWNoIHNlZ21lbnQsIGxhc3QgPSAweEZGRkYuCisjdWludDE2CXJlc2VydmVkUGFkCQkJCQkjIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHplcm8KKyN1aW50MTYJc3RhcnRDb2RlW3NlZ0NvdW50XQkJCSMgU3RhcnRpbmcgY2hhcmFjdGVyIGNvZGUgZm9yIGVhY2ggc2VnbWVudAorI3VpbnQxNglpZERlbHRhW3NlZ0NvdW50XQkJCSMgRGVsdGEgZm9yIGFsbCBjaGFyYWN0ZXIgY29kZXMgaW4gc2VnbWVudAorI3VpbnQxNglpZFJhbmdlT2Zmc2V0W3NlZ0NvdW50XQkJIyBPZmZzZXQgaW4gYnl0ZXMgdG8gZ2x5cGggaW5kZXhBcnJheSwgb3IgMAorI3VpbnQxNglnbHlwaEluZGV4QXJyYXlbdmFyaWFibGVdCSMgR2x5cGggaW5kZXggYXJyYXkKKworY2xhc3MgY21hcF9mb3JtYXRfNChDbWFwU3VidGFibGUpOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJKGZvcm1hdCwgbGVuZ3RoLCBzZWxmLnZlcnNpb24sIHNlZ0NvdW50WDIsIAorCQkJCXNlYXJjaFJhbmdlLCBlbnRyeVNlbGVjdG9yLCByYW5nZVNoaWZ0KSA9IFwKKwkJCQkJc3RydWN0LnVucGFjayhjbWFwX2Zvcm1hdF80X2Zvcm1hdCwgZGF0YVs6MTRdKQorCQlhc3NlcnQgbGVuKGRhdGEpID09IGxlbmd0aCwgImNvcnJ1cHQgY21hcCB0YWJsZSAoJWQsICVkKSIgJSAobGVuKGRhdGEpLCBsZW5ndGgpCisJCWRhdGEgPSBkYXRhWzE0Ol0KKwkJc2VnQ291bnRYMiA9IGludChzZWdDb3VudFgyKQorCQlzZWdDb3VudCA9IHNlZ0NvdW50WDIgLyAyCisJCQorCQlhbGxjb2RlcyA9IGFycmF5LmFycmF5KCJIIikKKwkJYWxsY29kZXMuZnJvbXN0cmluZyhkYXRhKQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQlhbGxjb2Rlcy5ieXRlc3dhcCgpCisJCQorCQkjIGRpdmlkZSB0aGUgZGF0YQorCQllbmRDb2RlID0gYWxsY29kZXNbOnNlZ0NvdW50XQorCQlhbGxjb2RlcyA9IGFsbGNvZGVzW3NlZ0NvdW50KzE6XQorCQlzdGFydENvZGUgPSBhbGxjb2Rlc1s6c2VnQ291bnRdCisJCWFsbGNvZGVzID0gYWxsY29kZXNbc2VnQ291bnQ6XQorCQlpZERlbHRhID0gYWxsY29kZXNbOnNlZ0NvdW50XQorCQlhbGxjb2RlcyA9IGFsbGNvZGVzW3NlZ0NvdW50Ol0KKwkJaWRSYW5nZU9mZnNldCA9IGFsbGNvZGVzWzpzZWdDb3VudF0KKwkJZ2x5cGhJbmRleEFycmF5ID0gYWxsY29kZXNbc2VnQ291bnQ6XQorCQkKKwkJIyBidWlsZCAyLWJ5dGUgY2hhcmFjdGVyIG1hcHBpbmcKKwkJY21hcCA9IHt9CisJCWZvciBpIGluIHJhbmdlKGxlbihzdGFydENvZGUpIC0gMSk6CSMgZG9uJ3QgZG8gMHhmZmZmIQorCQkJZm9yIGNoYXJDb2RlIGluIHJhbmdlKHN0YXJ0Q29kZVtpXSwgZW5kQ29kZVtpXSArIDEpOgorCQkJCXJhbmdlT2Zmc2V0ID0gaWRSYW5nZU9mZnNldFtpXQorCQkJCWlmIHJhbmdlT2Zmc2V0ID09IDA6CisJCQkJCWdseXBoSUQgPSBjaGFyQ29kZSArIGlkRGVsdGFbaV0KKwkJCQllbHNlOgorCQkJCQkjICpzb21lb25lKiBuZWVkcyB0byBnZXQga2lsbGVkLgorCQkJCQlpbmRleCA9IGlkUmFuZ2VPZmZzZXRbaV0gLyAyICsgKGNoYXJDb2RlIC0gc3RhcnRDb2RlW2ldKSArIGkgLSBsZW4oaWRSYW5nZU9mZnNldCkKKwkJCQkJaWYgZ2x5cGhJbmRleEFycmF5W2luZGV4XSA8PiAwOiAgIyBpZiBub3QgbWlzc2luZyBnbHlwaAorCQkJCQkJZ2x5cGhJRCA9IGdseXBoSW5kZXhBcnJheVtpbmRleF0gKyBpZERlbHRhW2ldCisJCQkJCWVsc2U6CisJCQkJCQlnbHlwaElEID0gMCAgIyBtaXNzaW5nIGdseXBoCisJCQkJY21hcFtjaGFyQ29kZV0gPSB0dEZvbnQuZ2V0R2x5cGhOYW1lKGdseXBoSUQgJSAweDEwMDAwKQorCQlzZWxmLmNtYXAgPSBjbWFwCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJZnJvbSBmb250VG9vbHMudHRMaWIuc2ZudCBpbXBvcnQgbWF4cG93ZXJvZnR3bworCQkKKwkJY29kZXMgPSBzZWxmLmNtYXAuaXRlbXMoKQorCQljb2Rlcy5zb3J0KCkKKwkJCisJCSMgYnVpbGQgc3RhcnRDb2RlIGFuZCBlbmRDb2RlIGxpc3RzCisJCWxhc3QgPSBjb2Rlc1swXVswXQorCQllbmRDb2RlID0gW10KKwkJc3RhcnRDb2RlID0gW2xhc3RdCisJCWZvciBjaGFyQ29kZSwgZ2x5cGhOYW1lIGluIGNvZGVzWzE6XTogICMgc2tpcCB0aGUgZmlyc3QgY29kZSwgaXQncyB0aGUgZmlyc3Qgc3RhcnQgY29kZQorCQkJaWYgY2hhckNvZGUgPT0gbGFzdCArIDE6CisJCQkJbGFzdCA9IGNoYXJDb2RlCisJCQkJY29udGludWUKKwkJCWVuZENvZGUuYXBwZW5kKGxhc3QpCisJCQlzdGFydENvZGUuYXBwZW5kKGNoYXJDb2RlKQorCQkJbGFzdCA9IGNoYXJDb2RlCisJCWVuZENvZGUuYXBwZW5kKGxhc3QpCisJCXN0YXJ0Q29kZS5hcHBlbmQoMHhmZmZmKQorCQllbmRDb2RlLmFwcGVuZCgweGZmZmYpCisJCQorCQkjIGJ1aWxkIHVwIHJlc3Qgb2YgY3J1ZnQuCisJCWlkRGVsdGEgPSBbXQorCQlpZFJhbmdlT2Zmc2V0ID0gW10KKwkJZ2x5cGhJbmRleEFycmF5ID0gW10KKwkJCisJCWZvciBpIGluIHJhbmdlKGxlbihlbmRDb2RlKS0xKTogICMgc2tpcCB0aGUgY2xvc2luZyBjb2RlcyAoMHhmZmZmKQorCQkJaW5kaWNlcyA9IFtdCisJCQlmb3IgY2hhckNvZGUgaW4gcmFuZ2Uoc3RhcnRDb2RlW2ldLCBlbmRDb2RlW2ldKzEpOgorCQkJCWluZGljZXMuYXBwZW5kKHR0Rm9udC5nZXRHbHlwaElEKHNlbGYuY21hcFtjaGFyQ29kZV0pKQorCQkJaWYgaW5kaWNlcyA9PSByYW5nZShpbmRpY2VzWzBdLCBpbmRpY2VzWzBdICsgbGVuKGluZGljZXMpKToKKwkJCQlpZERlbHRhLmFwcGVuZCgoaW5kaWNlc1swXSAtIHN0YXJ0Q29kZVtpXSkgJSAweDEwMDAwKQorCQkJCWlkUmFuZ2VPZmZzZXQuYXBwZW5kKDApCisJCQllbHNlOgorCQkJCSMgc29tZW9uZSAqZGVmaW5pdGVseSogbmVlZHMgdG8gZ2V0IGtpbGxlZC4KKwkJCQlpZERlbHRhLmFwcGVuZCgwKQorCQkJCWlkUmFuZ2VPZmZzZXQuYXBwZW5kKDIgKiAobGVuKGVuZENvZGUpICsgbGVuKGdseXBoSW5kZXhBcnJheSkgLSBpKSkKKwkJCQlnbHlwaEluZGV4QXJyYXkgPSBnbHlwaEluZGV4QXJyYXkgKyBpbmRpY2VzCisJCWlkRGVsdGEuYXBwZW5kKDEpICAjIDB4ZmZmZiArIDEgPT0gKHRhZGFhISkgMC4gU28gdGhpcyBlbmQgY29kZSBtYXBzIHRvIC5ub3RkZWYKKwkJaWRSYW5nZU9mZnNldC5hcHBlbmQoMCkKKwkJCisJCSMgSW5zYW5lLiAKKwkJc2VnQ291bnQgPSBsZW4oZW5kQ29kZSkKKwkJc2VnQ291bnRYMiA9IHNlZ0NvdW50ICogMgorCQltYXhleHBvbmVudCA9IG1heHBvd2Vyb2Z0d28oc2VnQ291bnQpCisJCXNlYXJjaFJhbmdlID0gMiAqICgyICoqIG1heGV4cG9uZW50KQorCQllbnRyeVNlbGVjdG9yID0gbWF4ZXhwb25lbnQKKwkJcmFuZ2VTaGlmdCA9IDIgKiBzZWdDb3VudCAtIHNlYXJjaFJhbmdlCisJCQorCQlhbGxjb2RlcyA9IGFycmF5LmFycmF5KCJIIiwgCisJCQkJZW5kQ29kZSArIFswXSArIHN0YXJ0Q29kZSArIGlkRGVsdGEgKyBpZFJhbmdlT2Zmc2V0ICsgZ2x5cGhJbmRleEFycmF5KQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQlhbGxjb2Rlcy5ieXRlc3dhcCgpCisJCWRhdGEgPSBhbGxjb2Rlcy50b3N0cmluZygpCisJCWxlbmd0aCA9IHN0cnVjdC5jYWxjc2l6ZShjbWFwX2Zvcm1hdF80X2Zvcm1hdCkgKyBsZW4oZGF0YSkKKwkJaGVhZGVyID0gc3RydWN0LnBhY2soY21hcF9mb3JtYXRfNF9mb3JtYXQsIHNlbGYuZm9ybWF0LCBsZW5ndGgsIHNlbGYudmVyc2lvbiwgCisJCQkJc2VnQ291bnRYMiwgc2VhcmNoUmFuZ2UsIGVudHJ5U2VsZWN0b3IsIHJhbmdlU2hpZnQpCisJCXJldHVybiBoZWFkZXIgKyBkYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJZnJvbSBmb250VG9vbHMudW5pY29kZSBpbXBvcnQgVW5pY29kZQorCQljb2RlcyA9IHNlbGYuY21hcC5pdGVtcygpCisJCWNvZGVzLnNvcnQoKQorCQl3cml0ZXIuYmVnaW50YWcoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIFsKKwkJCQkoInBsYXRmb3JtSUQiLCBzZWxmLnBsYXRmb3JtSUQpLAorCQkJCSgicGxhdEVuY0lEIiwgc2VsZi5wbGF0RW5jSUQpLAorCQkJCSgidmVyc2lvbiIsIHNlbGYudmVyc2lvbiksCisJCQkJXSkKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQkKKwkJZm9yIGNvZGUsIG5hbWUgaW4gY29kZXM6CisJCQl3cml0ZXIuc2ltcGxldGFnKCJtYXAiLCBjb2RlPWhleChjb2RlKSwgbmFtZT1uYW1lKQorCQkJd3JpdGVyLmNvbW1lbnQoVW5pY29kZVtjb2RlXSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCisJCXdyaXRlci5lbmR0YWcoc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZWxmLnZlcnNpb24gPSBzYWZlRXZhbChhdHRyc1sidmVyc2lvbiJdKQorCQlzZWxmLmNtYXAgPSB7fQorCQlmb3IgZWxlbWVudCBpbiBjb250ZW50OgorCQkJaWYgdHlwZShlbGVtZW50KSA8PiB0eXBlKCgpKToKKwkJCQljb250aW51ZQorCQkJbmFtZSwgYXR0cnMsIGNvbnRlbnQgPSBlbGVtZW50CisJCQlpZiBuYW1lIDw+ICJtYXAiOgorCQkJCWNvbnRpbnVlCisJCQlzZWxmLmNtYXBbc2FmZUV2YWwoYXR0cnNbImNvZGUiXSldID0gYXR0cnNbIm5hbWUiXQorCisKK2NsYXNzIGNtYXBfZm9ybWF0XzYoQ21hcFN1YnRhYmxlKToKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIHR0Rm9udCk6CisJCWZvcm1hdCwgbGVuZ3RoLCB2ZXJzaW9uLCBmaXJzdENvZGUsIGVudHJ5Q291bnQgPSBzdHJ1Y3QudW5wYWNrKAorCQkJCSI+SEhISEgiLCBkYXRhWzoxMF0pCisJCXNlbGYudmVyc2lvbiA9IGludCh2ZXJzaW9uKQorCQlmaXJzdENvZGUgPSBpbnQoZmlyc3RDb2RlKQorCQlzZWxmLnZlcnNpb24gPSBpbnQodmVyc2lvbikKKwkJZGF0YSA9IGRhdGFbMTA6XQorCQlhc3NlcnQgbGVuKGRhdGEpID09IDIgKiBlbnRyeUNvdW50CisJCWdseXBoSW5kZXhBcnJheSA9IGFycmF5LmFycmF5KCJIIikKKwkJZ2x5cGhJbmRleEFycmF5LmZyb21zdHJpbmcoZGF0YSkKKwkJaWYgdHRMaWIuZW5kaWFuIDw+ICJiaWciOgorCQkJZ2x5cGhJbmRleEFycmF5LmJ5dGVzd2FwKCkKKwkJc2VsZi5jbWFwID0gY21hcCA9IHt9CisJCWZvciBpIGluIHJhbmdlKGxlbihnbHlwaEluZGV4QXJyYXkpKToKKwkJCWdseXBoSUQgPSBnbHlwaEluZGV4QXJyYXlbaV0KKwkJCWdseXBoTmFtZSA9IHR0Rm9udC5nZXRHbHlwaE5hbWUoZ2x5cGhJRCkKKwkJCWNtYXBbaStmaXJzdENvZGVdID0gZ2x5cGhOYW1lCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJY29kZXMgPSBzZWxmLmNtYXAua2V5cygpCisJCWNvZGVzLnNvcnQoKQorCQlhc3NlcnQgY29kZXMgPT0gcmFuZ2UoY29kZXNbMF0sIGNvZGVzWzBdICsgbGVuKGNvZGVzKSkKKwkJZ2x5cGhJbmRleEFycmF5ID0gYXJyYXkuYXJyYXkoIkgiLCBbMF0gKiBsZW4oY29kZXMpKQorCQlmaXJzdENvZGUgPSBjb2Rlc1swXQorCQlmb3IgaSBpbiByYW5nZShsZW4oY29kZXMpKToKKwkJCWNvZGUgPSBjb2Rlc1tpXQorCQkJZ2x5cGhJbmRleEFycmF5W2NvZGUtZmlyc3RDb2RlXSA9IHR0Rm9udC5nZXRHbHlwaElEKHNlbGYuY21hcFtjb2RlXSkKKwkJaWYgdHRMaWIuZW5kaWFuIDw+ICJiaWciOgorCQkJZ2x5cGhJbmRleEFycmF5LmJ5dGVzd2FwKCkKKwkJZGF0YSA9IGdseXBoSW5kZXhBcnJheS50b3N0cmluZygpCisJCWhlYWRlciA9IHN0cnVjdC5wYWNrKCI+SEhISEgiLCAKKwkJCQk2LCBsZW4oZGF0YSkgKyAxMCwgc2VsZi52ZXJzaW9uLCBmaXJzdENvZGUsIGxlbihzZWxmLmNtYXApKQorCQlyZXR1cm4gaGVhZGVyICsgZGF0YQorCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCWNvZGVzID0gc2VsZi5jbWFwLml0ZW1zKCkKKwkJY29kZXMuc29ydCgpCisJCXdyaXRlci5iZWdpbnRhZyhzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgWworCQkJCSgicGxhdGZvcm1JRCIsIHNlbGYucGxhdGZvcm1JRCksCisJCQkJKCJwbGF0RW5jSUQiLCBzZWxmLnBsYXRFbmNJRCksCisJCQkJKCJ2ZXJzaW9uIiwgc2VsZi52ZXJzaW9uKSwKKwkJCQldKQorCQl3cml0ZXIubmV3bGluZSgpCisJCQorCQlmb3IgY29kZSwgbmFtZSBpbiBjb2RlczoKKwkJCXdyaXRlci5zaW1wbGV0YWcoIm1hcCIsIGNvZGU9aGV4KGNvZGUpLCBuYW1lPW5hbWUpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQorCQl3cml0ZXIuZW5kdGFnKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQorCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJc2VsZi52ZXJzaW9uID0gc2FmZUV2YWwoYXR0cnNbInZlcnNpb24iXSkKKwkJc2VsZi5jbWFwID0ge30KKwkJZm9yIGVsZW1lbnQgaW4gY29udGVudDoKKwkJCWlmIHR5cGUoZWxlbWVudCkgPD4gdHlwZSgoKSk6CisJCQkJY29udGludWUKKwkJCW5hbWUsIGF0dHJzLCBjb250ZW50ID0gZWxlbWVudAorCQkJaWYgbmFtZSA8PiAibWFwIjoKKwkJCQljb250aW51ZQorCQkJc2VsZi5jbWFwW3NhZmVFdmFsKGF0dHJzWyJjb2RlIl0pXSA9IGF0dHJzWyJuYW1lIl0KKworCitjbGFzcyBjbWFwX2Zvcm1hdF91bmtub3duKENtYXBTdWJ0YWJsZSk6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlzZWxmLmRhdGEgPSBkYXRhCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJcmV0dXJuIHNlbGYuZGF0YQorCisKK2NtYXBfY2xhc3NlcyA9IHsKKwkJMDogY21hcF9mb3JtYXRfMCwKKwkJMjogY21hcF9mb3JtYXRfMiwKKwkJNDogY21hcF9mb3JtYXRfNCwKKwkJNjogY21hcF9mb3JtYXRfNiwKKwkJfQorCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19jX3ZfdC5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19jX3ZfdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ1NTIzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2Nfdl90LnB5CkBAIC0wLDAgKzEsNDggQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBhcnJheQorZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCitmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwKKworY2xhc3MgdGFibGVfX2Nfdl90KERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJdmFsdWVzID0gYXJyYXkuYXJyYXkoImgiKQorCQl2YWx1ZXMuZnJvbXN0cmluZyhkYXRhKQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQl2YWx1ZXMuYnl0ZXN3YXAoKQorCQlzZWxmLnZhbHVlcyA9IHZhbHVlcworCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXZhbHVlcyA9IHNlbGYudmFsdWVzWzpdCisJCWlmIHR0TGliLmVuZGlhbiA8PiAiYmlnIjoKKwkJCXZhbHVlcy5ieXRlc3dhcCgpCisJCXJldHVybiB2YWx1ZXMudG9zdHJpbmcoKQorCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLnZhbHVlcykpOgorCQkJdmFsdWUgPSBzZWxmLnZhbHVlc1tpXQorCQkJd3JpdGVyLnNpbXBsZXRhZygiY3YiLCB2YWx1ZT12YWx1ZSwgaW5kZXg9aSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlpZiBub3QgaGFzYXR0cihzZWxmLCAidmFsdWVzIik6CisJCQlzZWxmLnZhbHVlcyA9IGFycmF5LmFycmF5KCJoIikKKwkJaWYgbmFtZSA9PSAiY3YiOgorCQkJaW5kZXggPSBzYWZlRXZhbChhdHRyc1siaW5kZXgiXSkKKwkJCXZhbHVlID0gc2FmZUV2YWwoYXR0cnNbInZhbHVlIl0pCisJCQlmb3IgaSBpbiByYW5nZSgxICsgaW5kZXggLSBsZW4oc2VsZi52YWx1ZXMpKToKKwkJCQlzZWxmLnZhbHVlcy5hcHBlbmQoMCkKKwkJCXNlbGYudmFsdWVzW2luZGV4XSA9IHZhbHVlCisJCisJZGVmIF9fbGVuX18oc2VsZik6CisJCXJldHVybiBsZW4oc2VsZi52YWx1ZXMpCisJCisJZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKwkJcmV0dXJuIHNlbGYudmFsdWVzW2luZGV4XQorCQorCWRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgdmFsdWUpOgorCQlzZWxmLnZhbHVlc1tpbmRleF0gPSB2YWx1ZQorCQorCWRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6CisJCWRlbCBzZWxmLnZhbHVlc1tpbmRleF0KKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2ZfcF9nX20ucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fZl9wX2dfbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2NjOGEzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2ZfcF9nX20ucHkKQEAgLTAsMCArMSwxNCBAQAoraW1wb3J0IERlZmF1bHRUYWJsZQoraW1wb3J0IGFycmF5CisKK2NsYXNzIHRhYmxlX19mX3BfZ19tKERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJc2VsZi5mcGdtID0gZGF0YQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXJldHVybiBzZWxmLmZwZ20KKwkKKwlkZWYgX19sZW5fXyhzZWxmKToKKwkJcmV0dXJuIGxlbihzZWxmLmZwZ20pCisJCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fZ19hX3NfcC5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19nX2Ffc19wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWNjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fZ19hX3NfcC5weQpAQCAtMCwwICsxLDQ2IEBACitpbXBvcnQgRGVmYXVsdFRhYmxlCitpbXBvcnQgc3RydWN0Citmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwKKworCitHQVNQX0RPR1JBWSA9IDB4MDAwMgorR0FTUF9HUklERklUID0gMHgwMDAxCisKK2NsYXNzIHRhYmxlX19nX2Ffc19wKERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJc2VsZi52ZXJzaW9uLCBudW1SYW5nZXMgPSBzdHJ1Y3QudW5wYWNrKCI+SEgiLCBkYXRhWzo0XSkKKwkJYXNzZXJ0IHNlbGYudmVyc2lvbiA9PSAwLCAidW5rbm93biAnZ2FzcCcgZm9ybWF0OiAlcyIgJSBzZWxmLnZlcnNpb24KKwkJZGF0YSA9IGRhdGFbNDpdCisJCXNlbGYuZ2FzcFJhbmdlID0ge30KKwkJZm9yIGkgaW4gcmFuZ2UobnVtUmFuZ2VzKToKKwkJCXJhbmdlTWF4UFBFTSwgcmFuZ2VHYXNwQmVoYXZpb3IgPSBzdHJ1Y3QudW5wYWNrKCI+SEgiLCBkYXRhWzo0XSkKKwkJCXNlbGYuZ2FzcFJhbmdlW2ludChyYW5nZU1heFBQRU0pXSA9IGludChyYW5nZUdhc3BCZWhhdmlvcikKKwkJCWRhdGEgPSBkYXRhWzQ6XQorCQlhc3NlcnQgbm90IGRhdGEsICJ0b28gbXVjaCBkYXRhIgorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCW51bVJhbmdlcyA9IGxlbihzZWxmLmdhc3BSYW5nZSkKKwkJZGF0YSA9IHN0cnVjdC5wYWNrKCI+SEgiLCAwLCBudW1SYW5nZXMpCisJCWl0ZW1zID0gc2VsZi5nYXNwUmFuZ2UuaXRlbXMoKQorCQlpdGVtcy5zb3J0KCkKKwkJZm9yIHJhbmdlTWF4UFBFTSwgcmFuZ2VHYXNwQmVoYXZpb3IgaW4gaXRlbXM6CisJCQlkYXRhID0gZGF0YSArIHN0cnVjdC5wYWNrKCI+SEgiLCByYW5nZU1heFBQRU0sIHJhbmdlR2FzcEJlaGF2aW9yKQorCQlyZXR1cm4gZGF0YQorCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCWl0ZW1zID0gc2VsZi5nYXNwUmFuZ2UuaXRlbXMoKQorCQlpdGVtcy5zb3J0KCkKKwkJZm9yIHJhbmdlTWF4UFBFTSwgcmFuZ2VHYXNwQmVoYXZpb3IgaW4gaXRlbXM6CisJCQl3cml0ZXIuc2ltcGxldGFnKCJnYXNwUmFuZ2UiLCBbCisJCQkJCSgicmFuZ2VNYXhQUEVNIiwgcmFuZ2VNYXhQUEVNKSwKKwkJCQkJKCJyYW5nZUdhc3BCZWhhdmlvciIsIHJhbmdlR2FzcEJlaGF2aW9yKV0pCisJCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJaWYgbmFtZSA8PiAiZ2FzcFJhbmdlIjoKKwkJCXJldHVybgorCQlpZiBub3QgaGFzYXR0cihzZWxmLCAiZ2FzcFJhbmdlIik6CisJCQlzZWxmLmdhc3BSYW5nZSA9IHt9CisJCXNlbGYuZ2FzcFJhbmdlW3NhZmVFdmFsKGF0dHJzWyJyYW5nZU1heFBQRU0iXSldID0gc2FmZUV2YWwoYXR0cnNbInJhbmdlR2FzcEJlaGF2aW9yIl0pCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19nX2xfeV9mLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2dfbF95X2YucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmOWJlNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19nX2xfeV9mLnB5CkBAIC0wLDAgKzEsNzc4IEBACisiIiJfZ19sX3lfZi5weSAtLSBDb252ZXJ0ZXIgY2xhc3NlcyBmb3IgdGhlICdnbHlmJyB0YWJsZS4iIiIKKworCisjCisjIFRoZSBBcHBsZSBhbmQgTVMgcmFzdGVyaXplcnMgYmVoYXZlIGRpZmZlcmVudGx5IGZvciAKKyMgc2NhbGVkIGNvbXBvc2l0ZSBjb21wb25lbnRzOiBvbmUgZG9lcyBzY2FsZSBmaXJzdCBhbmQgdGhlbiB0cmFuc2xhdGUKKyMgYW5kIHRoZSBvdGhlciBkb2VzIGl0IHZpY2UgdmVyc2EuIE1TIGRlZmluZWQgc29tZSBmbGFncyB0byBpbmRpY2F0ZQorIyB0aGUgZGlmZmVyZW5jZSwgYnV0IGl0IHNlZW1zIG5vYm9keSBhY3R1YWxseSBfc2V0c18gdGhvc2UgZmxhZ3MuCisjCisjIEZ1bm55IHRoaW5nOiBBcHBsZSBzZWVtcyB0byBfb25seV8gZG8gdGhlaXIgdGhpbmcgaW4gdGhlCisjIFdFX0hBVkVfQV9TQ0FMRSAoZWcuIENoaWNhZ28pIGNhc2UsIGFuZCBub3Qgd2hlbiBpdCdzIFdFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSAKKyMgKGVnLiBDaGFyY29hbCkuLi4KKyMKK1NDQUxFX0NPTVBPTkVOVF9PRkZTRVRfREVGQVVMVCA9IDAgICAjIDAgPT0gTVMsIDEgPT0gQXBwbGUKKworCitpbXBvcnQgc3RydWN0LCBzc3RydWN0CitpbXBvcnQgRGVmYXVsdFRhYmxlCitmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKK2Zyb20gZm9udFRvb2xzLm1pc2MudGV4dFRvb2xzIGltcG9ydCBzYWZlRXZhbCwgcmVhZEhleAoraW1wb3J0IGFycmF5CitpbXBvcnQgTnVtZXJpYworaW1wb3J0IHR5cGVzCisKK2NsYXNzIHRhYmxlX19nX2xfeV9mKERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJbG9jYSA9IHR0Rm9udFsnbG9jYSddCisJCWxhc3QgPSBsb2NhWzBdCisJCXNlbGYuZ2x5cGhzID0ge30KKwkJc2VsZi5nbHlwaE9yZGVyID0gW10KKwkJc2VsZi5nbHlwaE9yZGVyID0gZ2x5cGhPcmRlciA9IHR0Rm9udC5nZXRHbHlwaE9yZGVyKCkKKwkJZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGxvY2EpLTEpOgorCQkJZ2x5cGhOYW1lID0gZ2x5cGhPcmRlcltpXQorCQkJbmV4dCA9IGxvY2FbaSsxXQorCQkJZ2x5cGhkYXRhID0gZGF0YVtsYXN0Om5leHRdCisJCQlpZiBsZW4oZ2x5cGhkYXRhKSA8PiAobmV4dCAtIGxhc3QpOgorCQkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJub3QgZW5vdWdoICdnbHlmJyB0YWJsZSBkYXRhIgorCQkJZ2x5cGggPSBHbHlwaChnbHlwaGRhdGEpCisJCQlzZWxmLmdseXBoc1tnbHlwaE5hbWVdID0gZ2x5cGgKKwkJCWxhc3QgPSBuZXh0CisJCWlmIGxlbihkYXRhKSA+IG5leHQ6CisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAidG9vIG11Y2ggJ2dseWYnIHRhYmxlIGRhdGEiCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJaW1wb3J0IHN0cmluZworCQlsb2NhdGlvbnMgPSBbXQorCQljdXJyZW50TG9jYXRpb24gPSAwCisJCWRhdGFMaXN0ID0gW10KKwkJZm9yIGdseXBoTmFtZSBpbiB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpOgorCQkJZ2x5cGggPSBzZWxmW2dseXBoTmFtZV0KKwkJCWdseXBoRGF0YSA9IGdseXBoLmNvbXBpbGUoc2VsZikKKwkJCWxvY2F0aW9ucy5hcHBlbmQoY3VycmVudExvY2F0aW9uKQorCQkJY3VycmVudExvY2F0aW9uID0gY3VycmVudExvY2F0aW9uICsgbGVuKGdseXBoRGF0YSkKKwkJCWRhdGFMaXN0LmFwcGVuZChnbHlwaERhdGEpCisJCWxvY2F0aW9ucy5hcHBlbmQoY3VycmVudExvY2F0aW9uKQorCQlkYXRhID0gc3RyaW5nLmpvaW4oZGF0YUxpc3QsICIiKQorCQl0dEZvbnRbJ2xvY2EnXS5zZXQobG9jYXRpb25zKQorCQl0dEZvbnRbJ21heHAnXS5udW1HbHlwaHMgPSBsZW4oc2VsZi5nbHlwaHMpCisJCXJldHVybiBkYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250LCBwcm9ncmVzcz1Ob25lLCBjb21wYWN0R2x5cGhzPTApOgorCQl3cml0ZXIubmV3bGluZSgpCisJCWdseXBoT3JkZXIgPSB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpCisJCXdyaXRlci5iZWdpbnRhZygiR2x5cGhPcmRlciIpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkJZm9yIGkgaW4gcmFuZ2UobGVuKGdseXBoT3JkZXIpKToKKwkJCWdseXBoTmFtZSA9IGdseXBoT3JkZXJbaV0KKwkJCXdyaXRlci5zaW1wbGV0YWcoIkdseXBoSUQiLCBpZD1pLCBuYW1lPWdseXBoTmFtZSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJd3JpdGVyLmVuZHRhZygiR2x5cGhPcmRlciIpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQlnbHlwaE5hbWVzID0gdHRGb250LmdldEdseXBoTmFtZXMoKQorCQl3cml0ZXIuY29tbWVudCgiVGhlIHhNaW4sIHlNaW4sIHhNYXggYW5kIHlNYXggdmFsdWVzXG53aWxsIGJlIHJlY2FsY3VsYXRlZCBieSB0aGUgY29tcGlsZXIuIikKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQl3cml0ZXIubmV3bGluZSgpCisJCWZvciBnbHlwaE5hbWUgaW4gZ2x5cGhOYW1lczoKKwkJCWlmIHByb2dyZXNzOgorCQkJCXByb2dyZXNzLnNldGxhYmVsKCJEdW1waW5nICdnbHlmJyB0YWJsZS4uLiAoJXMpIiAlIGdseXBoTmFtZSkKKwkJCQlwcm9ncmVzcy5pbmNyZW1lbnQoKQorCQkJZ2x5cGggPSBzZWxmW2dseXBoTmFtZV0KKwkJCWlmIGdseXBoLm51bWJlck9mQ29udG91cnM6CisJCQkJd3JpdGVyLmJlZ2ludGFnKCdUVEdseXBoJywgWworCQkJCQkJKCJuYW1lIiwgZ2x5cGhOYW1lKSwKKwkJCQkJCSgieE1pbiIsIGdseXBoLnhNaW4pLAorCQkJCQkJKCJ5TWluIiwgZ2x5cGgueU1pbiksCisJCQkJCQkoInhNYXgiLCBnbHlwaC54TWF4KSwKKwkJCQkJCSgieU1heCIsIGdseXBoLnlNYXgpLAorCQkJCQkJXSkKKwkJCQl3cml0ZXIubmV3bGluZSgpCisJCQkJZ2x5cGgudG9YTUwod3JpdGVyLCB0dEZvbnQpCisJCQkJaWYgY29tcGFjdEdseXBoczoKKwkJCQkJZ2x5cGguY29tcGFjdChzZWxmKQorCQkJCXdyaXRlci5lbmR0YWcoJ1RUR2x5cGgnKQorCQkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCWVsc2U6CisJCQkJd3JpdGVyLnNpbXBsZXRhZygnVFRHbHlwaCcsIG5hbWU9Z2x5cGhOYW1lKQorCQkJCXdyaXRlci5jb21tZW50KCJjb250YWlucyBubyBvdXRsaW5lIGRhdGEiKQorCQkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlpZiBuYW1lID09ICJHbHlwaE9yZGVyIjoKKwkJCWdseXBoT3JkZXIgPSBbXQorCQkJZm9yIGVsZW1lbnQgaW4gY29udGVudDoKKwkJCQlpZiB0eXBlKGVsZW1lbnQpID09IHR5cGVzLlN0cmluZ1R5cGU6CisJCQkJCWNvbnRpbnVlCisJCQkJbmFtZSwgYXR0cnMsIGNvbnRlbnQgPSBlbGVtZW50CisJCQkJaWYgbmFtZSA9PSAiR2x5cGhJRCI6CisJCQkJCWluZGV4ID0gc2FmZUV2YWwoYXR0cnNbImlkIl0pCisJCQkJCWdseXBoTmFtZSA9IGF0dHJzWyJuYW1lIl0KKwkJCQkJZ2x5cGhPcmRlciA9IGdseXBoT3JkZXIgKyAoMSArIGluZGV4IC0gbGVuKGdseXBoT3JkZXIpKSAqIFsiLm5vdGRlZiJdCisJCQkJCWdseXBoT3JkZXJbaW5kZXhdID0gZ2x5cGhOYW1lCisJCQl0dEZvbnQuc2V0R2x5cGhPcmRlcihnbHlwaE9yZGVyKQorCQllbGlmIG5hbWUgPT0gIlRUR2x5cGgiOgorCQkJaWYgbm90IGhhc2F0dHIoc2VsZiwgImdseXBocyIpOgorCQkJCXNlbGYuZ2x5cGhzID0ge30KKwkJCWdseXBoTmFtZSA9IGF0dHJzWyJuYW1lIl0KKwkJCWlmIHR0Rm9udC52ZXJib3NlOgorCQkJCXR0TGliLmRlYnVnbXNnKCJ1bnBhY2tpbmcgZ2x5cGggJyVzJyIgJSBnbHlwaE5hbWUpCisJCQlnbHlwaCA9IEdseXBoKCkKKwkJCWZvciBhdHRyIGluIFsneE1pbicsICd5TWluJywgJ3hNYXgnLCAneU1heCddOgorCQkJCXNldGF0dHIoZ2x5cGgsIGF0dHIsIHNhZmVFdmFsKGF0dHJzLmdldChhdHRyLCAnMCcpKSkKKwkJCXNlbGYuZ2x5cGhzW2dseXBoTmFtZV0gPSBnbHlwaAorCQkJZm9yIGVsZW1lbnQgaW4gY29udGVudDoKKwkJCQlpZiB0eXBlKGVsZW1lbnQpID09IHR5cGVzLlN0cmluZ1R5cGU6CisJCQkJCWNvbnRpbnVlCisJCQkJZ2x5cGguZnJvbVhNTChlbGVtZW50LCB0dEZvbnQpCisJCisJZGVmIHNldEdseXBoT3JkZXIoc2VsZiwgZ2x5cGhPcmRlcik6CisJCXNlbGYuZ2x5cGhPcmRlciA9IGdseXBoT3JkZXIKKwkKKwlkZWYgZ2V0R2x5cGhOYW1lKHNlbGYsIGdseXBoSUQpOgorCQlyZXR1cm4gc2VsZi5nbHlwaE9yZGVyW2dseXBoSURdCisJCisJZGVmIGdldEdseXBoSUQoc2VsZiwgZ2x5cGhOYW1lKToKKwkJIyBYWFggb3B0aW1pemUgd2l0aCByZXZlcnNlIGRpY3QhISEKKwkJcmV0dXJuIHNlbGYuZ2x5cGhPcmRlci5pbmRleChnbHlwaE5hbWUpCisJCisJI2RlZiBrZXlzKHNlbGYpOgorCSMJcmV0dXJuIHNlbGYuZ2x5cGhPcmRlcls6XQorCSMKKwkjZGVmIGhhc19rZXkoc2VsZiwgZ2x5cGhOYW1lKToKKwkjCXJldHVybiBzZWxmLmdseXBocy5oYXNfa2V5KGdseXBoTmFtZSkKKwkjCisJZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGdseXBoTmFtZSk6CisJCWdseXBoID0gc2VsZi5nbHlwaHNbZ2x5cGhOYW1lXQorCQlnbHlwaC5leHBhbmQoc2VsZikKKwkJcmV0dXJuIGdseXBoCisJCisJZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGdseXBoTmFtZSwgZ2x5cGgpOgorCQlzZWxmLmdseXBoc1tnbHlwaE5hbWVdID0gZ2x5cGgKKwkJaWYgZ2x5cGhOYW1lIG5vdCBpbiBzZWxmLmdseXBoT3JkZXI6CisJCQlzZWxmLmdseXBoT3JkZXIuYXBwZW5kKGdseXBoTmFtZSkKKwkKKwlkZWYgX19kZWxpdGVtX18oc2VsZiwgZ2x5cGhOYW1lKToKKwkJZGVsIHNlbGYuZ2x5cGhzW2dseXBoTmFtZV0KKwkJc2VsZi5nbHlwaE9yZGVyLnJlbW92ZShnbHlwaE5hbWUpCisJCisJZGVmIF9fbGVuX18oc2VsZik6CisJCWFzc2VydCBsZW4oc2VsZi5nbHlwaE9yZGVyKSA9PSBsZW4oc2VsZi5nbHlwaHMpCisJCXJldHVybiBsZW4oc2VsZi5nbHlwaHMpCisKKworZ2x5cGhIZWFkZXJGb3JtYXQgPSAiIiIKKwkJPgkjIGJpZyBlbmRpYW4KKwkJbnVtYmVyT2ZDb250b3VyczoJaAorCQl4TWluOgkJCQloCisJCXlNaW46CQkJCWgKKwkJeE1heDoJCQkJaAorCQl5TWF4OgkJCQloCisiIiIKKworIyBmbGFncworZmxhZ09uQ3VydmUgPSAweDAxCitmbGFnWFNob3J0ID0gMHgwMgorZmxhZ1lTaG9ydCA9IDB4MDQKK2ZsYWdSZXBlYXQgPSAweDA4CitmbGFnWHNhbWUgPSAgMHgxMAorZmxhZ1lzYW1lID0gMHgyMAorZmxhZ1Jlc2VydmVkMSA9IDB4NDAKK2ZsYWdSZXNlcnZlZDIgPSAweDgwCisKKworQVJHXzFfQU5EXzJfQVJFX1dPUkRTICAgICAgPSAweDAwMDEgICMgaWYgc2V0IGFyZ3MgYXJlIHdvcmRzIG90aGVyd2lzZSB0aGV5IGFyZSBieXRlcyAKK0FSR1NfQVJFX1hZX1ZBTFVFUyAgICAgICAgID0gMHgwMDAyICAjIGlmIHNldCBhcmdzIGFyZSB4eSB2YWx1ZXMsIG90aGVyd2lzZSB0aGV5IGFyZSBwb2ludHMgCitST1VORF9YWV9UT19HUklEICAgICAgICAgICA9IDB4MDAwNCAgIyBmb3IgdGhlIHh5IHZhbHVlcyBpZiBhYm92ZSBpcyB0cnVlIAorV0VfSEFWRV9BX1NDQUxFICAgICAgICAgICAgPSAweDAwMDggICMgU3ggPSBTeSwgb3RoZXJ3aXNlIHNjYWxlID09IDEuMCAKK05PTl9PVkVSTEFQUElORyAgICAgICAgICAgID0gMHgwMDEwICAjIHNldCB0byBzYW1lIHZhbHVlIGZvciBhbGwgY29tcG9uZW50cyAob2Jzb2xldGUhKQorTU9SRV9DT01QT05FTlRTICAgICAgICAgICAgPSAweDAwMjAgICMgaW5kaWNhdGVzIGF0IGxlYXN0IG9uZSBtb3JlIGdseXBoIGFmdGVyIHRoaXMgb25lIAorV0VfSEFWRV9BTl9YX0FORF9ZX1NDQUxFICAgPSAweDAwNDAgICMgU3gsIFN5IAorV0VfSEFWRV9BX1RXT19CWV9UV08gICAgICAgPSAweDAwODAgICMgdDAwLCB0MDEsIHQxMCwgdDExIAorV0VfSEFWRV9JTlNUUlVDVElPTlMgICAgICAgPSAweDAxMDAgICMgaW5zdHJ1Y3Rpb25zIGZvbGxvdyAKK1VTRV9NWV9NRVRSSUNTICAgICAgICAgICAgID0gMHgwMjAwICAjIGFwcGx5IHRoZXNlIG1ldHJpY3MgdG8gcGFyZW50IGdseXBoIAorT1ZFUkxBUF9DT01QT1VORCAgICAgICAgICAgPSAweDA0MDAgICMgdXNlZCBieSBBcHBsZSBpbiBHWCBmb250cyAKK1NDQUxFRF9DT01QT05FTlRfT0ZGU0VUICAgID0gMHgwODAwICAjIGNvbXBvc2l0ZSBkZXNpZ25lZCB0byBoYXZlIHRoZSBjb21wb25lbnQgb2Zmc2V0IHNjYWxlZCAoZGVzaWduZWQgZm9yIEFwcGxlKSAKK1VOU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQgID0gMHgxMDAwICAjIGNvbXBvc2l0ZSBkZXNpZ25lZCBub3QgdG8gaGF2ZSB0aGUgY29tcG9uZW50IG9mZnNldCBzY2FsZWQgKGRlc2lnbmVkIGZvciBNUykgCisKKworY2xhc3MgR2x5cGg6CisJCisJZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9IiIpOgorCQlpZiBub3QgZGF0YToKKwkJCSMgZW1wdHkgY2hhcgorCQkJc2VsZi5udW1iZXJPZkNvbnRvdXJzID0gMAorCQkJcmV0dXJuCisJCXNlbGYuZGF0YSA9IGRhdGEKKwkKKwlkZWYgY29tcGFjdChzZWxmLCBnbHlmVGFibGUpOgorCQlkYXRhID0gc2VsZi5jb21waWxlKGdseWZUYWJsZSkKKwkJc2VsZi5fX2RpY3RfXy5jbGVhcigpCisJCXNlbGYuZGF0YSA9IGRhdGEKKwkKKwlkZWYgZXhwYW5kKHNlbGYsIGdseWZUYWJsZSk6CisJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJkYXRhIik6CisJCQkjIGFscmVhZHkgdW5wYWNrZWQKKwkJCXJldHVybgorCQlkdW1teSwgZGF0YSA9IHNzdHJ1Y3QudW5wYWNrMihnbHlwaEhlYWRlckZvcm1hdCwgc2VsZi5kYXRhLCBzZWxmKQorCQlkZWwgc2VsZi5kYXRhCisJCWlmIHNlbGYubnVtYmVyT2ZDb250b3VycyA9PSAtMToKKwkJCXNlbGYuZGVjb21waWxlQ29tcG9uZW50cyhkYXRhLCBnbHlmVGFibGUpCisJCWVsc2U6CisJCQlzZWxmLmRlY29tcGlsZUNvb3JkaW5hdGVzKGRhdGEpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgZ2x5ZlRhYmxlKToKKwkJaWYgaGFzYXR0cihzZWxmLCAiZGF0YSIpOgorCQkJcmV0dXJuIHNlbGYuZGF0YQorCQlpZiBzZWxmLm51bWJlck9mQ29udG91cnMgPT0gMDoKKwkJCXJldHVybiAiIgorCQlzZWxmLnJlY2FsY0JvdW5kcyhnbHlmVGFibGUpCisJCWRhdGEgPSBzc3RydWN0LnBhY2soZ2x5cGhIZWFkZXJGb3JtYXQsIHNlbGYpCisJCWlmIHNlbGYubnVtYmVyT2ZDb250b3VycyA9PSAtMToKKwkJCWRhdGEgPSBkYXRhICsgc2VsZi5jb21waWxlQ29tcG9uZW50cyhnbHlmVGFibGUpCisJCWVsc2U6CisJCQlkYXRhID0gZGF0YSArIHNlbGYuY29tcGlsZUNvb3JkaW5hdGVzKCkKKwkJIyBmcm9tIHRoZSBzcGVjOiAiTm90ZSB0aGF0IHRoZSBsb2NhbCBvZmZzZXRzIHNob3VsZCBiZSB3b3JkLWFsaWduZWQiCisJCWlmIGxlbihkYXRhKSAlIDI6CisJCQkjIC4uLnNvIGlmIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaXMgb2RkLCBhcHBlbmQgYSBudWxsIGJ5dGUKKwkJCWRhdGEgPSBkYXRhICsgIlwwIgorCQlyZXR1cm4gZGF0YQorCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCWlmIHNlbGYubnVtYmVyT2ZDb250b3VycyA9PSAtMToKKwkJCWZvciBjb21wbyBpbiBzZWxmLmNvbXBvbmVudHM6CisJCQkJY29tcG8udG9YTUwod3JpdGVyLCB0dEZvbnQpCisJCQlpZiBoYXNhdHRyKHNlbGYsICJpbnN0cnVjdGlvbnMiKToKKwkJCQl3cml0ZXIuYmVnaW50YWcoImluc3RydWN0aW9ucyIpCisJCQkJd3JpdGVyLm5ld2xpbmUoKQorCQkJCXdyaXRlci5kdW1waGV4KHNlbGYuaW5zdHJ1Y3Rpb25zKQorCQkJCXdyaXRlci5lbmR0YWcoImluc3RydWN0aW9ucyIpCisJCQkJd3JpdGVyLm5ld2xpbmUoKQorCQllbHNlOgorCQkJbGFzdCA9IDAKKwkJCWZvciBpIGluIHJhbmdlKHNlbGYubnVtYmVyT2ZDb250b3Vycyk6CisJCQkJd3JpdGVyLmJlZ2ludGFnKCJjb250b3VyIikKKwkJCQl3cml0ZXIubmV3bGluZSgpCisJCQkJZm9yIGogaW4gcmFuZ2UobGFzdCwgc2VsZi5lbmRQdHNPZkNvbnRvdXJzW2ldICsgMSk6CisJCQkJCXdyaXRlci5zaW1wbGV0YWcoInB0IiwgWworCQkJCQkJCSgieCIsIHNlbGYuY29vcmRpbmF0ZXNbal1bMF0pLCAKKwkJCQkJCQkoInkiLCBzZWxmLmNvb3JkaW5hdGVzW2pdWzFdKSwKKwkJCQkJCQkoIm9uIiwgc2VsZi5mbGFnc1tqXSAmIGZsYWdPbkN1cnZlKV0pCisJCQkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCQlsYXN0ID0gc2VsZi5lbmRQdHNPZkNvbnRvdXJzW2ldICsgMQorCQkJCXdyaXRlci5lbmR0YWcoImNvbnRvdXIiKQorCQkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCWlmIHNlbGYubnVtYmVyT2ZDb250b3VyczoKKwkJCQl3cml0ZXIuYmVnaW50YWcoImluc3RydWN0aW9ucyIpCisJCQkJd3JpdGVyLm5ld2xpbmUoKQorCQkJCXdyaXRlci5kdW1waGV4KHNlbGYuaW5zdHJ1Y3Rpb25zKQorCQkJCXdyaXRlci5lbmR0YWcoImluc3RydWN0aW9ucyIpCisJCQkJd3JpdGVyLm5ld2xpbmUoKQorCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIHR0Rm9udCk6CisJCWlmIG5hbWUgPT0gImNvbnRvdXIiOgorCQkJc2VsZi5udW1iZXJPZkNvbnRvdXJzID0gc2VsZi5udW1iZXJPZkNvbnRvdXJzICsgMQorCQkJaWYgc2VsZi5udW1iZXJPZkNvbnRvdXJzIDwgMDoKKwkJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAiY2FuJ3QgbWl4IGNvbXBvc2l0ZXMgYW5kIGNvbnRvdXJzIGluIGdseXBoIgorCQkJY29vcmRpbmF0ZXMgPSBbXQorCQkJZmxhZ3MgPSBbXQorCQkJZm9yIGVsZW1lbnQgaW4gY29udGVudDoKKwkJCQlpZiB0eXBlKGVsZW1lbnQpID09IHR5cGVzLlN0cmluZ1R5cGU6CisJCQkJCWNvbnRpbnVlCisJCQkJbmFtZSwgYXR0cnMsIGNvbnRlbnQgPSBlbGVtZW50CisJCQkJaWYgbmFtZSA8PiAicHQiOgorCQkJCQljb250aW51ZSAgIyBpZ25vcmUgYW55dGhpbmcgYnV0ICJwdCIKKwkJCQljb29yZGluYXRlcy5hcHBlbmQoW3NhZmVFdmFsKGF0dHJzWyJ4Il0pLCBzYWZlRXZhbChhdHRyc1sieSJdKV0pCisJCQkJZmxhZ3MuYXBwZW5kKG5vdCBub3Qgc2FmZUV2YWwoYXR0cnNbIm9uIl0pKQorCQkJY29vcmRpbmF0ZXMgPSBOdW1lcmljLmFycmF5KGNvb3JkaW5hdGVzLCBOdW1lcmljLkludDE2KQorCQkJZmxhZ3MgPSBOdW1lcmljLmFycmF5KGZsYWdzLCBOdW1lcmljLkludDgpCisJCQlpZiBub3QgaGFzYXR0cihzZWxmLCAiY29vcmRpbmF0ZXMiKToKKwkJCQlzZWxmLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMKKwkJCQlzZWxmLmZsYWdzID0gZmxhZ3MKKwkJCQlzZWxmLmVuZFB0c09mQ29udG91cnMgPSBbbGVuKGNvb3JkaW5hdGVzKS0xXQorCQkJZWxzZToKKwkJCQlzZWxmLmNvb3JkaW5hdGVzID0gTnVtZXJpYy5jb25jYXRlbmF0ZSgoc2VsZi5jb29yZGluYXRlcywgY29vcmRpbmF0ZXMpKQorCQkJCXNlbGYuZmxhZ3MgPSBOdW1lcmljLmNvbmNhdGVuYXRlKChzZWxmLmZsYWdzLCBmbGFncykpCisJCQkJc2VsZi5lbmRQdHNPZkNvbnRvdXJzLmFwcGVuZChsZW4oc2VsZi5jb29yZGluYXRlcyktMSkKKwkJZWxpZiBuYW1lID09ICJjb21wb25lbnQiOgorCQkJaWYgc2VsZi5udW1iZXJPZkNvbnRvdXJzID4gMDoKKwkJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAiY2FuJ3QgbWl4IGNvbXBvc2l0ZXMgYW5kIGNvbnRvdXJzIGluIGdseXBoIgorCQkJc2VsZi5udW1iZXJPZkNvbnRvdXJzID0gLTEKKwkJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJjb21wb25lbnRzIik6CisJCQkJc2VsZi5jb21wb25lbnRzID0gW10KKwkJCWNvbXBvbmVudCA9IEdseXBoQ29tcG9uZW50KCkKKwkJCXNlbGYuY29tcG9uZW50cy5hcHBlbmQoY29tcG9uZW50KQorCQkJY29tcG9uZW50LmZyb21YTUwoKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KQorCQllbGlmIG5hbWUgPT0gImluc3RydWN0aW9ucyI6CisJCQlzZWxmLmluc3RydWN0aW9ucyA9IHJlYWRIZXgoY29udGVudCkKKwkKKwlkZWYgZ2V0Q29tcG9zaXRlTWF4cFZhbHVlcyhzZWxmLCBnbHlmVGFibGUsIG1heENvbXBvbmVudERlcHRoPTEpOgorCQlhc3NlcnQgc2VsZi5udW1iZXJPZkNvbnRvdXJzID09IC0xCisJCW5Db250b3VycyA9IDAKKwkJblBvaW50cyA9IDAKKwkJZm9yIGNvbXBvIGluIHNlbGYuY29tcG9uZW50czoKKwkJCWJhc2VHbHlwaCA9IGdseWZUYWJsZVtjb21wby5nbHlwaE5hbWVdCisJCQlpZiBiYXNlR2x5cGgubnVtYmVyT2ZDb250b3VycyA9PSAwOgorCQkJCWNvbnRpbnVlCisJCQllbGlmIGJhc2VHbHlwaC5udW1iZXJPZkNvbnRvdXJzID4gMDoKKwkJCQluUCwgbkMgPSBiYXNlR2x5cGguZ2V0TWF4cFZhbHVlcygpCisJCQllbHNlOgorCQkJCW5QLCBuQywgbWF4Q29tcG9uZW50RGVwdGggPSBiYXNlR2x5cGguZ2V0Q29tcG9zaXRlTWF4cFZhbHVlcygKKwkJCQkJCWdseWZUYWJsZSwgbWF4Q29tcG9uZW50RGVwdGggKyAxKQorCQkJblBvaW50cyA9IG5Qb2ludHMgKyBuUAorCQkJbkNvbnRvdXJzID0gbkNvbnRvdXJzICsgbkMKKwkJcmV0dXJuIG5Qb2ludHMsIG5Db250b3VycywgbWF4Q29tcG9uZW50RGVwdGgKKwkKKwlkZWYgZ2V0TWF4cFZhbHVlcyhzZWxmKToKKwkJYXNzZXJ0IHNlbGYubnVtYmVyT2ZDb250b3VycyA+IDAKKwkJcmV0dXJuIGxlbihzZWxmLmNvb3JkaW5hdGVzKSwgbGVuKHNlbGYuZW5kUHRzT2ZDb250b3VycykKKwkKKwlkZWYgZGVjb21waWxlQ29tcG9uZW50cyhzZWxmLCBkYXRhLCBnbHlmVGFibGUpOgorCQlzZWxmLmNvbXBvbmVudHMgPSBbXQorCQltb3JlID0gMQorCQloYXZlSW5zdHJ1Y3Rpb25zID0gMAorCQl3aGlsZSBtb3JlOgorCQkJY29tcG9uZW50ID0gR2x5cGhDb21wb25lbnQoKQorCQkJbW9yZSwgaGF2ZUluc3RyLCBkYXRhID0gY29tcG9uZW50LmRlY29tcGlsZShkYXRhLCBnbHlmVGFibGUpCisJCQloYXZlSW5zdHJ1Y3Rpb25zID0gaGF2ZUluc3RydWN0aW9ucyB8IGhhdmVJbnN0cgorCQkJc2VsZi5jb21wb25lbnRzLmFwcGVuZChjb21wb25lbnQpCisJCWlmIGhhdmVJbnN0cnVjdGlvbnM6CisJCQludW1JbnN0cnVjdGlvbnMsID0gc3RydWN0LnVucGFjaygiPmgiLCBkYXRhWzoyXSkKKwkJCWRhdGEgPSBkYXRhWzI6XQorCQkJc2VsZi5pbnN0cnVjdGlvbnMgPSBkYXRhWzpudW1JbnN0cnVjdGlvbnNdCisJCQlkYXRhID0gZGF0YVtudW1JbnN0cnVjdGlvbnM6XQorCQkJYXNzZXJ0IGxlbihkYXRhKSBpbiAoMCwgMSksICJiYWQgY29tcG9zaXRlIGRhdGEiCisJCisJZGVmIGRlY29tcGlsZUNvb3JkaW5hdGVzKHNlbGYsIGRhdGEpOgorCQllbmRQdHNPZkNvbnRvdXJzID0gYXJyYXkuYXJyYXkoImgiKQorCQllbmRQdHNPZkNvbnRvdXJzLmZyb21zdHJpbmcoZGF0YVs6MipzZWxmLm51bWJlck9mQ29udG91cnNdKQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQllbmRQdHNPZkNvbnRvdXJzLmJ5dGVzd2FwKCkKKwkJc2VsZi5lbmRQdHNPZkNvbnRvdXJzID0gZW5kUHRzT2ZDb250b3Vycy50b2xpc3QoKQorCQkKKwkJZGF0YSA9IGRhdGFbMipzZWxmLm51bWJlck9mQ29udG91cnM6XQorCQkKKwkJaW5zdHJ1Y3Rpb25MZW5ndGgsID0gc3RydWN0LnVucGFjaygiPmgiLCBkYXRhWzoyXSkKKwkJZGF0YSA9IGRhdGFbMjpdCisJCXNlbGYuaW5zdHJ1Y3Rpb25zID0gZGF0YVs6aW5zdHJ1Y3Rpb25MZW5ndGhdCisJCWRhdGEgPSBkYXRhW2luc3RydWN0aW9uTGVuZ3RoOl0KKwkJbkNvb3JkaW5hdGVzID0gc2VsZi5lbmRQdHNPZkNvbnRvdXJzWy0xXSArIDEKKwkJZmxhZ3MsIHhDb29yZGluYXRlcywgeUNvb3JkaW5hdGVzID0gXAorCQkJCXNlbGYuZGVjb21waWxlQ29vcmRpbmF0ZXNSYXcobkNvb3JkaW5hdGVzLCBkYXRhKQorCQkKKwkJIyBmaWxsIGluIHJlcGV0aXRpb25zIGFuZCBhcHBseSBzaWducworCQljb29yZGluYXRlcyA9IE51bWVyaWMuemVyb3MoKG5Db29yZGluYXRlcywgMiksIE51bWVyaWMuSW50MTYpCisJCXhJbmRleCA9IDAKKwkJeUluZGV4ID0gMAorCQlmb3IgaSBpbiByYW5nZShuQ29vcmRpbmF0ZXMpOgorCQkJZmxhZyA9IGZsYWdzW2ldCisJCQkjIHggY29vcmRpbmF0ZQorCQkJaWYgZmxhZyAmIGZsYWdYU2hvcnQ6CisJCQkJaWYgZmxhZyAmIGZsYWdYc2FtZToKKwkJCQkJeCA9IHhDb29yZGluYXRlc1t4SW5kZXhdCisJCQkJZWxzZToKKwkJCQkJeCA9IC14Q29vcmRpbmF0ZXNbeEluZGV4XQorCQkJCXhJbmRleCA9IHhJbmRleCArIDEKKwkJCWVsaWYgZmxhZyAmIGZsYWdYc2FtZToKKwkJCQl4ID0gMAorCQkJZWxzZToKKwkJCQl4ID0geENvb3JkaW5hdGVzW3hJbmRleF0KKwkJCQl4SW5kZXggPSB4SW5kZXggKyAxCisJCQkjIHkgY29vcmRpbmF0ZQorCQkJaWYgZmxhZyAmIGZsYWdZU2hvcnQ6CisJCQkJaWYgZmxhZyAmIGZsYWdZc2FtZToKKwkJCQkJeSA9IHlDb29yZGluYXRlc1t5SW5kZXhdCisJCQkJZWxzZToKKwkJCQkJeSA9IC15Q29vcmRpbmF0ZXNbeUluZGV4XQorCQkJCXlJbmRleCA9IHlJbmRleCArIDEKKwkJCWVsaWYgZmxhZyAmIGZsYWdZc2FtZToKKwkJCQl5ID0gMAorCQkJZWxzZToKKwkJCQl5ID0geUNvb3JkaW5hdGVzW3lJbmRleF0KKwkJCQl5SW5kZXggPSB5SW5kZXggKyAxCisJCQljb29yZGluYXRlc1tpXSA9ICh4LCB5KQorCQlhc3NlcnQgeEluZGV4ID09IGxlbih4Q29vcmRpbmF0ZXMpCisJCWFzc2VydCB5SW5kZXggPT0gbGVuKHlDb29yZGluYXRlcykKKwkJIyBjb252ZXJ0IHJlbGF0aXZlIHRvIGFic29sdXRlIGNvb3JkaW5hdGVzCisJCXNlbGYuY29vcmRpbmF0ZXMgPSBOdW1lcmljLmFkZC5hY2N1bXVsYXRlKGNvb3JkaW5hdGVzKQorCQkjIGRpc2NhcmQgYWxsIGZsYWdzIGJ1dCBmb3IgImZsYWdPbkN1cnZlIgorCQlpZiBoYXNhdHRyKE51bWVyaWMsICJfX3ZlcnNpb25fXyIpOgorCQkJc2VsZi5mbGFncyA9IE51bWVyaWMuYml0d2lzZV9hbmQoZmxhZ3MsIGZsYWdPbkN1cnZlKS5hc3R5cGUoTnVtZXJpYy5JbnQ4KQorCQllbHNlOgorCQkJc2VsZi5mbGFncyA9IE51bWVyaWMuYm9vbGVhbl9hbmQoZmxhZ3MsIGZsYWdPbkN1cnZlKS5hc3R5cGUoTnVtZXJpYy5JbnQ4KQorCQorCWRlZiBkZWNvbXBpbGVDb29yZGluYXRlc1JhdyhzZWxmLCBuQ29vcmRpbmF0ZXMsIGRhdGEpOgorCQkjIHVucGFjayBmbGFncyBhbmQgcHJlcGFyZSB1bnBhY2tpbmcgb2YgY29vcmRpbmF0ZXMKKwkJZmxhZ3MgPSBOdW1lcmljLmFycmF5KFswXSAqIG5Db29yZGluYXRlcywgTnVtZXJpYy5JbnQ4KQorCQkjIFdhcm5pbmc6IGRlZXAgUHl0aG9uIHRyaWNrZXJ5IGdvaW5nIG9uLiBXZSB1c2UgdGhlIHN0cnVjdCBtb2R1bGUgdG8gdW5wYWNrCisJCSMgdGhlIGNvb3JkaW5hdGVzLiBXZSBidWlsZCBhIGZvcm1hdCBzdHJpbmcgYmFzZWQgb24gdGhlIGZsYWdzLCBzbyB3ZSBjYW4KKwkJIyB1bnBhY2sgdGhlIGNvb3JkaW5hdGVzIGluIG9uZSBzdHJ1Y3QudW5wYWNrKCkgY2FsbC4KKwkJeEZvcm1hdCA9ICI+IiAjIGJpZyBlbmRpYW4KKwkJeUZvcm1hdCA9ICI+IiAjIGJpZyBlbmRpYW4KKwkJaSA9IGogPSAwCisJCXdoaWxlIDE6CisJCQlmbGFnID0gb3JkKGRhdGFbaV0pCisJCQlpID0gaSArIDEKKwkJCXJlcGVhdCA9IDEKKwkJCWlmIGZsYWcgJiBmbGFnUmVwZWF0OgorCQkJCXJlcGVhdCA9IG9yZChkYXRhW2ldKSArIDEKKwkJCQlpID0gaSArIDEKKwkJCWZvciBrIGluIHJhbmdlKHJlcGVhdCk6CisJCQkJaWYgZmxhZyAmIGZsYWdYU2hvcnQ6CisJCQkJCXhGb3JtYXQgPSB4Rm9ybWF0ICsgJ0InCisJCQkJZWxpZiBub3QgKGZsYWcgJiBmbGFnWHNhbWUpOgorCQkJCQl4Rm9ybWF0ID0geEZvcm1hdCArICdoJworCQkJCWlmIGZsYWcgJiBmbGFnWVNob3J0OgorCQkJCQl5Rm9ybWF0ID0geUZvcm1hdCArICdCJworCQkJCWVsaWYgbm90IChmbGFnICYgZmxhZ1lzYW1lKToKKwkJCQkJeUZvcm1hdCA9IHlGb3JtYXQgKyAnaCcKKwkJCQlmbGFnc1tqXSA9IGZsYWcKKwkJCQlqID0gaiArIDEKKwkJCWlmIGogPj0gbkNvb3JkaW5hdGVzOgorCQkJCWJyZWFrCisJCWFzc2VydCBqID09IG5Db29yZGluYXRlcywgImJhZCBnbHlwaCBmbGFncyIKKwkJZGF0YSA9IGRhdGFbaTpdCisJCSMgdW5wYWNrIHJhdyBjb29yZGluYXRlcywga3JycnJyci10Y2hpbmchCisJCXhEYXRhTGVuID0gc3RydWN0LmNhbGNzaXplKHhGb3JtYXQpCisJCXlEYXRhTGVuID0gc3RydWN0LmNhbGNzaXplKHlGb3JtYXQpCisJCWlmIChsZW4oZGF0YSkgLSAoeERhdGFMZW4gKyB5RGF0YUxlbikpIG5vdCBpbiAoMCwgMSk6CisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAiYmFkIGdseXBoIHJlY29yZCIKKwkJeENvb3JkaW5hdGVzID0gc3RydWN0LnVucGFjayh4Rm9ybWF0LCBkYXRhWzp4RGF0YUxlbl0pCisJCXlDb29yZGluYXRlcyA9IHN0cnVjdC51bnBhY2soeUZvcm1hdCwgZGF0YVt4RGF0YUxlbjp4RGF0YUxlbit5RGF0YUxlbl0pCisJCXJldHVybiBmbGFncywgeENvb3JkaW5hdGVzLCB5Q29vcmRpbmF0ZXMKKwkKKwlkZWYgY29tcGlsZUNvbXBvbmVudHMoc2VsZiwgZ2x5ZlRhYmxlKToKKwkJZGF0YSA9ICIiCisJCWxhc3Rjb21wb25lbnQgPSBsZW4oc2VsZi5jb21wb25lbnRzKSAtIDEKKwkJbW9yZSA9IDEKKwkJaGF2ZUluc3RydWN0aW9ucyA9IDAKKwkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29tcG9uZW50cykpOgorCQkJaWYgaSA9PSBsYXN0Y29tcG9uZW50OgorCQkJCWhhdmVJbnN0cnVjdGlvbnMgPSBoYXNhdHRyKHNlbGYsICJpbnN0cnVjdGlvbnMiKQorCQkJCW1vcmUgPSAwCisJCQljb21wbyA9IHNlbGYuY29tcG9uZW50c1tpXQorCQkJZGF0YSA9IGRhdGEgKyBjb21wby5jb21waWxlKG1vcmUsIGhhdmVJbnN0cnVjdGlvbnMsIGdseWZUYWJsZSkKKwkJaWYgaGF2ZUluc3RydWN0aW9uczoKKwkJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIj5oIiwgbGVuKHNlbGYuaW5zdHJ1Y3Rpb25zKSkgKyBzZWxmLmluc3RydWN0aW9ucworCQlyZXR1cm4gZGF0YQorCQkJCisJCisJZGVmIGNvbXBpbGVDb29yZGluYXRlcyhzZWxmKToKKwkJYXNzZXJ0IGxlbihzZWxmLmNvb3JkaW5hdGVzKSA9PSBsZW4oc2VsZi5mbGFncykKKwkJZGF0YSA9ICIiCisJCWVuZFB0c09mQ29udG91cnMgPSBhcnJheS5hcnJheSgiaCIsIHNlbGYuZW5kUHRzT2ZDb250b3VycykKKwkJaWYgdHRMaWIuZW5kaWFuIDw+ICJiaWciOgorCQkJZW5kUHRzT2ZDb250b3Vycy5ieXRlc3dhcCgpCisJCWRhdGEgPSBkYXRhICsgZW5kUHRzT2ZDb250b3Vycy50b3N0cmluZygpCisJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIj5oIiwgbGVuKHNlbGYuaW5zdHJ1Y3Rpb25zKSkKKwkJZGF0YSA9IGRhdGEgKyBzZWxmLmluc3RydWN0aW9ucworCQluQ29vcmRpbmF0ZXMgPSBsZW4oc2VsZi5jb29yZGluYXRlcykKKwkJCisJCSMgbWFrZSBhIGNvcHkKKwkJY29vcmRpbmF0ZXMgPSBzZWxmLmNvb3JkaW5hdGVzLmFzdHlwZShzZWxmLmNvb3JkaW5hdGVzLnR5cGVjb2RlKCkpCisJCSMgYWJzb2x1dGUgdG8gcmVsYXRpdmUgY29vcmRpbmF0ZXMKKwkJY29vcmRpbmF0ZXNbMTpdID0gTnVtZXJpYy5zdWJ0cmFjdChjb29yZGluYXRlc1sxOl0sIGNvb3JkaW5hdGVzWzotMV0pCisJCWZsYWdzID0gc2VsZi5mbGFncworCQljb21wcmVzc2VkZmxhZ3MgPSBbXQorCQl4UG9pbnRzID0gW10KKwkJeVBvaW50cyA9IFtdCisJCXhGb3JtYXQgPSAiPiIKKwkJeUZvcm1hdCA9ICI+IgorCQlsYXN0ZmxhZyA9IE5vbmUKKwkJcmVwZWF0ID0gMAorCQlmb3IgaSBpbiByYW5nZShsZW4oY29vcmRpbmF0ZXMpKToKKwkJCSMgT2gsIHRoZSBob3Jyb3JzIG9mIFRydWVUeXBlCisJCQlmbGFnID0gc2VsZi5mbGFnc1tpXQorCQkJeCwgeSA9IGNvb3JkaW5hdGVzW2ldCisJCQkjIGRvIHgKKwkJCWlmIHggPT0gMDoKKwkJCQlmbGFnID0gZmxhZyB8IGZsYWdYc2FtZQorCQkJZWxpZiAtMjU1IDw9IHggPD0gMjU1OgorCQkJCWZsYWcgPSBmbGFnIHwgZmxhZ1hTaG9ydAorCQkJCWlmIHggPiAwOgorCQkJCQlmbGFnID0gZmxhZyB8IGZsYWdYc2FtZQorCQkJCWVsc2U6CisJCQkJCXggPSAteAorCQkJCXhQb2ludHMuYXBwZW5kKHgpCisJCQkJeEZvcm1hdCA9IHhGb3JtYXQgKyAnQicKKwkJCWVsc2U6CisJCQkJeFBvaW50cy5hcHBlbmQoeCkKKwkJCQl4Rm9ybWF0ID0geEZvcm1hdCArICdoJworCQkJIyBkbyB5CisJCQlpZiB5ID09IDA6CisJCQkJZmxhZyA9IGZsYWcgfCBmbGFnWXNhbWUKKwkJCWVsaWYgLTI1NSA8PSB5IDw9IDI1NToKKwkJCQlmbGFnID0gZmxhZyB8IGZsYWdZU2hvcnQKKwkJCQlpZiB5ID4gMDoKKwkJCQkJZmxhZyA9IGZsYWcgfCBmbGFnWXNhbWUKKwkJCQllbHNlOgorCQkJCQl5ID0gLXkKKwkJCQl5UG9pbnRzLmFwcGVuZCh5KQorCQkJCXlGb3JtYXQgPSB5Rm9ybWF0ICsgJ0InCisJCQllbHNlOgorCQkJCXlQb2ludHMuYXBwZW5kKHkpCisJCQkJeUZvcm1hdCA9IHlGb3JtYXQgKyAnaCcKKwkJCSMgaGFuZGxlIHJlcGVhdGluZyBmbGFncworCQkJaWYgZmxhZyA9PSBsYXN0ZmxhZzoKKwkJCQlyZXBlYXQgPSByZXBlYXQgKyAxCisJCQkJaWYgcmVwZWF0ID09IDE6CisJCQkJCWNvbXByZXNzZWRmbGFncy5hcHBlbmQoZmxhZykKKwkJCQllbGlmIHJlcGVhdCA+IDE6CisJCQkJCWNvbXByZXNzZWRmbGFnc1stMl0gPSBmbGFnIHwgZmxhZ1JlcGVhdAorCQkJCQljb21wcmVzc2VkZmxhZ3NbLTFdID0gcmVwZWF0CisJCQkJZWxzZToKKwkJCQkJY29tcHJlc3NlZGZsYWdzWy0xXSA9IHJlcGVhdAorCQkJZWxzZToKKwkJCQlyZXBlYXQgPSAwCisJCQkJY29tcHJlc3NlZGZsYWdzLmFwcGVuZChmbGFnKQorCQkJbGFzdGZsYWcgPSBmbGFnCisJCWRhdGEgPSBkYXRhICsgYXJyYXkuYXJyYXkoIkIiLCBjb21wcmVzc2VkZmxhZ3MpLnRvc3RyaW5nKCkKKwkJZGF0YSA9IGRhdGEgKyBhcHBseShzdHJ1Y3QucGFjaywgKHhGb3JtYXQsKSt0dXBsZSh4UG9pbnRzKSkKKwkJZGF0YSA9IGRhdGEgKyBhcHBseShzdHJ1Y3QucGFjaywgKHlGb3JtYXQsKSt0dXBsZSh5UG9pbnRzKSkKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgcmVjYWxjQm91bmRzKHNlbGYsIGdseWZUYWJsZSk6CisJCWNvb3JkaW5hdGVzLCBlbmRQdHMsIGZsYWdzID0gc2VsZi5nZXRDb29yZGluYXRlcyhnbHlmVGFibGUpCisJCXNlbGYueE1pbiwgc2VsZi55TWluID0gTnVtZXJpYy5taW5pbXVtLnJlZHVjZShjb29yZGluYXRlcykKKwkJc2VsZi54TWF4LCBzZWxmLnlNYXggPSBOdW1lcmljLm1heGltdW0ucmVkdWNlKGNvb3JkaW5hdGVzKQorCQorCWRlZiBnZXRDb29yZGluYXRlcyhzZWxmLCBnbHlmVGFibGUpOgorCQlpZiBzZWxmLm51bWJlck9mQ29udG91cnMgPiAwOgorCQkJcmV0dXJuIHNlbGYuY29vcmRpbmF0ZXMsIHNlbGYuZW5kUHRzT2ZDb250b3Vycywgc2VsZi5mbGFncworCQllbGlmIHNlbGYubnVtYmVyT2ZDb250b3VycyA9PSAtMToKKwkJCSMgaXQncyBhIGNvbXBvc2l0ZQorCQkJYWxsQ29vcmRzID0gTm9uZQorCQkJYWxsRmxhZ3MgPSBOb25lCisJCQlhbGxFbmRQdHMgPSBOb25lCisJCQlmb3IgY29tcG8gaW4gc2VsZi5jb21wb25lbnRzOgorCQkJCWcgPSBnbHlmVGFibGVbY29tcG8uZ2x5cGhOYW1lXQorCQkJCWNvb3JkaW5hdGVzLCBlbmRQdHMsIGZsYWdzID0gZy5nZXRDb29yZGluYXRlcyhnbHlmVGFibGUpCisJCQkJaWYgaGFzYXR0cihjb21wbywgImZpcnN0cHQiKToKKwkJCQkJIyBtb3ZlIGFjY29yZGluZyB0byB0d28gcmVmZXJlbmNlIHBvaW50cworCQkJCQltb3ZlID0gYWxsQ29vcmRzW2NvbXBvLmZpcnN0cHRdIC0gY29vcmRpbmF0ZXNbY29tcG8uc2Vjb25kcHRdCisJCQkJZWxzZToKKwkJCQkJbW92ZSA9IGNvbXBvLngsIGNvbXBvLnkKKwkJCQkKKwkJCQlpZiBub3QgaGFzYXR0cihjb21wbywgInRyYW5zZm9ybSIpOgorCQkJCQljb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzICsgbW92ZSAgIyBJIGxvdmUgTnVtUHkhCisJCQkJZWxzZToKKwkJCQkJYXBwbGVfd2F5ID0gY29tcG8uZmxhZ3MgJiBTQ0FMRURfQ09NUE9ORU5UX09GRlNFVAorCQkJCQltc193YXkgPSBjb21wby5mbGFncyAmIFVOU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQKKwkJCQkJYXNzZXJ0IG5vdCAoYXBwbGVfd2F5IGFuZCBtc193YXkpCisJCQkJCWlmIG5vdCAoYXBwbGVfd2F5IG9yIG1zX3dheSk6CisJCQkJCQlzY2FsZV9jb21wb25lbnRfb2Zmc2V0ID0gU0NBTEVfQ09NUE9ORU5UX09GRlNFVF9ERUZBVUxUICAjIHNlZSB0b3Agb2YgdGhpcyBmaWxlCisJCQkJCWVsc2U6CisJCQkJCQlzY2FsZV9jb21wb25lbnRfb2Zmc2V0ID0gYXBwbGVfd2F5CisJCQkJCWlmIHNjYWxlX2NvbXBvbmVudF9vZmZzZXQ6CisJCQkJCQkjIHRoZSBBcHBsZSB3YXk6IGZpcnN0IG1vdmUsIHRoZW4gc2NhbGUgKGllLiBzY2FsZSB0aGUgY29tcG9uZW50IG9mZnNldCkKKwkJCQkJCWNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMgKyBtb3ZlCisJCQkJCQljb29yZGluYXRlcyA9IE51bWVyaWMuZG90KGNvb3JkaW5hdGVzLCBjb21wby50cmFuc2Zvcm0pCisJCQkJCWVsc2U6CisJCQkJCQkjIHRoZSBNUyB3YXk6IGZpcnN0IHNjYWxlLCB0aGVuIG1vdmUKKwkJCQkJCWNvb3JkaW5hdGVzID0gTnVtZXJpYy5kb3QoY29vcmRpbmF0ZXMsIGNvbXBvLnRyYW5zZm9ybSkKKwkJCQkJCWNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMgKyBtb3ZlCisJCQkJCSMgZHVlIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGUgY29vcmRzLiBhcmUgbm93IGZsb2F0czsKKwkJCQkJIyByb3VuZCB0aGVtIG9mZiBuaWNlbHksIGFuZCBjYXN0IHRvIHNob3J0CisJCQkJCWNvb3JkaW5hdGVzID0gTnVtZXJpYy5mbG9vcihjb29yZGluYXRlcyArIDAuNSkuYXN0eXBlKE51bWVyaWMuSW50MTYpCisJCQkJaWYgYWxsQ29vcmRzIGlzIE5vbmU6CisJCQkJCWFsbENvb3JkcyA9IGNvb3JkaW5hdGVzCisJCQkJCWFsbEVuZFB0cyA9IGVuZFB0cworCQkJCQlhbGxGbGFncyA9IGZsYWdzCisJCQkJZWxzZToKKwkJCQkJYWxsRW5kUHRzID0gYWxsRW5kUHRzICsgKE51bWVyaWMuYXJyYXkoZW5kUHRzKSArIGxlbihhbGxDb29yZHMpKS50b2xpc3QoKQorCQkJCQlhbGxDb29yZHMgPSBOdW1lcmljLmNvbmNhdGVuYXRlKChhbGxDb29yZHMsIGNvb3JkaW5hdGVzKSkKKwkJCQkJYWxsRmxhZ3MgPSBOdW1lcmljLmNvbmNhdGVuYXRlKChhbGxGbGFncywgZmxhZ3MpKQorCQkJcmV0dXJuIGFsbENvb3JkcywgYWxsRW5kUHRzLCBhbGxGbGFncworCQllbHNlOgorCQkJcmV0dXJuIE51bWVyaWMuYXJyYXkoW10sIE51bWVyaWMuSW50MTYpLCBbXSwgTnVtZXJpYy5hcnJheShbXSwgTnVtZXJpYy5JbnQ4KQorCQorCWRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKwkJaWYgc2VsZi5udW1iZXJPZkNvbnRvdXJzIDw9IDA6CisJCQlyZXR1cm4gY21wKHNlbGYuX19kaWN0X18sIG90aGVyLl9fZGljdF9fKQorCQllbHNlOgorCQkJaWYgY21wKGxlbihzZWxmLmNvb3JkaW5hdGVzKSwgbGVuKG90aGVyLmNvb3JkaW5hdGVzKSk6CisJCQkJcmV0dXJuIDEKKwkJCWN0ZXN0ID0gTnVtZXJpYy5hbGx0cnVlKE51bWVyaWMuYWxsdHJ1ZShOdW1lcmljLmVxdWFsKHNlbGYuY29vcmRpbmF0ZXMsIG90aGVyLmNvb3JkaW5hdGVzKSkpCisJCQlmdGVzdCA9IE51bWVyaWMuYWxsdHJ1ZShOdW1lcmljLmVxdWFsKHNlbGYuZmxhZ3MsIG90aGVyLmZsYWdzKSkKKwkJCWlmIG5vdCBjdGVzdCBvciBub3QgZnRlc3Q6CisJCQkJcmV0dXJuIDEKKwkJCXJldHVybiAoCisJCQkJCWNtcChzZWxmLmVuZFB0c09mQ29udG91cnMsIG90aGVyLmVuZFB0c09mQ29udG91cnMpIG9yCisJCQkJCWNtcChzZWxmLmluc3RydWN0aW9ucywgb3RoZXIuaW5zdHJ1Y3Rpb25zKQorCQkJCSkKKworCitjbGFzcyBHbHlwaENvbXBvbmVudDoKKwkKKwlkZWYgX19pbml0X18oc2VsZik6CisJCXBhc3MKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIGdseWZUYWJsZSk6CisJCWZsYWdzLCBnbHlwaElEID0gc3RydWN0LnVucGFjaygiPkhIIiwgZGF0YVs6NF0pCisJCXNlbGYuZmxhZ3MgPSBpbnQoZmxhZ3MpCisJCWdseXBoSUQgPSBpbnQoZ2x5cGhJRCkKKwkJc2VsZi5nbHlwaE5hbWUgPSBnbHlmVGFibGUuZ2V0R2x5cGhOYW1lKGludChnbHlwaElEKSkKKwkJI3ByaW50ICI+PiIsIHJlcHJmbGFnKHNlbGYuZmxhZ3MpCisJCWRhdGEgPSBkYXRhWzQ6XQorCQkKKwkJaWYgc2VsZi5mbGFncyAmIEFSR18xX0FORF8yX0FSRV9XT1JEUzoKKwkJCWlmIHNlbGYuZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVM6CisJCQkJc2VsZi54LCBzZWxmLnkgPSBzdHJ1Y3QudW5wYWNrKCI+aGgiLCBkYXRhWzo0XSkKKwkJCWVsc2U6CisJCQkJeCwgeSA9IHN0cnVjdC51bnBhY2soIj5ISCIsIGRhdGFbOjRdKQorCQkJCXNlbGYuZmlyc3RwdCwgc2VsZi5zZWNvbmRwdCA9IGludCh4KSwgaW50KHkpCisJCQlkYXRhID0gZGF0YVs0Ol0KKwkJZWxzZToKKwkJCWlmIHNlbGYuZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVM6CisJCQkJc2VsZi54LCBzZWxmLnkgPSBzdHJ1Y3QudW5wYWNrKCI+YmIiLCBkYXRhWzoyXSkKKwkJCWVsc2U6CisJCQkJeCwgeSA9IHN0cnVjdC51bnBhY2soIj5CQiIsIGRhdGFbOjRdKQorCQkJCXNlbGYuZmlyc3RwdCwgc2VsZi5zZWNvbmRwdCA9IGludCh4KSwgaW50KHkpCisJCQlkYXRhID0gZGF0YVsyOl0KKwkJCisJCWlmIHNlbGYuZmxhZ3MgJiBXRV9IQVZFX0FfU0NBTEU6CisJCQlzY2FsZSwgPSBzdHJ1Y3QudW5wYWNrKCI+aCIsIGRhdGFbOjJdKQorCQkJc2VsZi50cmFuc2Zvcm0gPSBOdW1lcmljLmFycmF5KAorCQkJCQlbW3NjYWxlLCAwXSwgWzAsIHNjYWxlXV0pIC8gZmxvYXQoMHg0MDAwKSAgIyBmaXhlZCAyLjE0CisJCQlkYXRhID0gZGF0YVsyOl0KKwkJZWxpZiBzZWxmLmZsYWdzICYgV0VfSEFWRV9BTl9YX0FORF9ZX1NDQUxFOgorCQkJeHNjYWxlLCB5c2NhbGUgPSBzdHJ1Y3QudW5wYWNrKCI+aGgiLCBkYXRhWzo0XSkKKwkJCXNlbGYudHJhbnNmb3JtID0gTnVtZXJpYy5hcnJheSgKKwkJCQkJW1t4c2NhbGUsIDBdLCBbMCwgeXNjYWxlXV0pIC8gZmxvYXQoMHg0MDAwKSAgIyBmaXhlZCAyLjE0CisJCQlkYXRhID0gZGF0YVs0Ol0KKwkJZWxpZiBzZWxmLmZsYWdzICYgV0VfSEFWRV9BX1RXT19CWV9UV086CisJCQkoeHNjYWxlLCBzY2FsZTAxLCAKKwkJCQkJc2NhbGUxMCwgeXNjYWxlKSA9IHN0cnVjdC51bnBhY2soIj5oaGhoIiwgZGF0YVs6OF0pCisJCQlzZWxmLnRyYW5zZm9ybSA9IE51bWVyaWMuYXJyYXkoCisJCQkJCVtbeHNjYWxlLCBzY2FsZTAxXSwgW3NjYWxlMTAsIHlzY2FsZV1dKSAvIGZsb2F0KDB4NDAwMCkgICMgZml4ZWQgMi4xNAorCQkJZGF0YSA9IGRhdGFbODpdCisJCW1vcmUgPSBzZWxmLmZsYWdzICYgTU9SRV9DT01QT05FTlRTCisJCWhhdmVJbnN0cnVjdGlvbnMgPSBzZWxmLmZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMKKwkJc2VsZi5mbGFncyA9IHNlbGYuZmxhZ3MgJiAoUk9VTkRfWFlfVE9fR1JJRCB8IFVTRV9NWV9NRVRSSUNTIHwgCisJCQkJU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQgfCBVTlNDQUxFRF9DT01QT05FTlRfT0ZGU0VUIHwKKwkJCQlOT05fT1ZFUkxBUFBJTkcpCisJCXJldHVybiBtb3JlLCBoYXZlSW5zdHJ1Y3Rpb25zLCBkYXRhCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgbW9yZSwgaGF2ZUluc3RydWN0aW9ucywgZ2x5ZlRhYmxlKToKKwkJZGF0YSA9ICIiCisJCQorCQkjIHJlc2V0IGFsbCBmbGFncyB3ZSB3aWxsIGNhbGN1bGF0ZSBvdXJzZWx2ZXMKKwkJZmxhZ3MgPSBzZWxmLmZsYWdzICYgKFJPVU5EX1hZX1RPX0dSSUQgfCBVU0VfTVlfTUVUUklDUyB8IAorCQkJCVNDQUxFRF9DT01QT05FTlRfT0ZGU0VUIHwgVU5TQ0FMRURfQ09NUE9ORU5UX09GRlNFVCB8CisJCQkJTk9OX09WRVJMQVBQSU5HKQorCQlpZiBtb3JlOgorCQkJZmxhZ3MgPSBmbGFncyB8IE1PUkVfQ09NUE9ORU5UUworCQlpZiBoYXZlSW5zdHJ1Y3Rpb25zOgorCQkJZmxhZ3MgPSBmbGFncyB8IFdFX0hBVkVfSU5TVFJVQ1RJT05TCisJCQorCQlpZiBoYXNhdHRyKHNlbGYsICJmaXJzdHB0Iik6CisJCQlpZiAoMCA8PSBzZWxmLmZpcnN0cHQgPD0gMjU1KSBhbmQgKDAgPD0gc2VsZi5zZWNvbmRwdCA8PSAyNTUpOgorCQkJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIj5CQiIsIHNlbGYuZmlyc3RwdCwgc2VsZi5zZWNvbmRwdCkKKwkJCWVsc2U6CisJCQkJZGF0YSA9IGRhdGEgKyBzdHJ1Y3QucGFjaygiPkhIIiwgc2VsZi5maXJzdHB0LCBzZWxmLnNlY29uZHB0KQorCQkJCWZsYWdzID0gZmxhZ3MgfCBBUkdfMV9BTkRfMl9BUkVfV09SRFMKKwkJZWxzZToKKwkJCWZsYWdzID0gZmxhZ3MgfCBBUkdTX0FSRV9YWV9WQUxVRVMKKwkJCWlmICgtMTI4IDw9IHNlbGYueCA8PSAxMjcpIGFuZCAoLTEyOCA8PSBzZWxmLnkgPD0gMTI3KToKKwkJCQlkYXRhID0gZGF0YSArIHN0cnVjdC5wYWNrKCI+YmIiLCBzZWxmLngsIHNlbGYueSkKKwkJCWVsc2U6CisJCQkJZGF0YSA9IGRhdGEgKyBzdHJ1Y3QucGFjaygiPmhoIiwgc2VsZi54LCBzZWxmLnkpCisJCQkJZmxhZ3MgPSBmbGFncyB8IEFSR18xX0FORF8yX0FSRV9XT1JEUworCQkKKwkJaWYgaGFzYXR0cihzZWxmLCAidHJhbnNmb3JtIik6CisJCQkjIFhYWCBuZWVkcyBtb3JlIHRlc3RpbmcKKwkJCXRyYW5zZm9ybSA9IE51bWVyaWMuZmxvb3Ioc2VsZi50cmFuc2Zvcm0gKiAweDQwMDAgKyAwLjUpCisJCQlpZiB0cmFuc2Zvcm1bMF1bMV0gb3IgdHJhbnNmb3JtWzFdWzBdOgorCQkJCWZsYWdzID0gZmxhZ3MgfCBXRV9IQVZFX0FfVFdPX0JZX1RXTworCQkJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIj5oaGhoIiwgCisJCQkJCQl0cmFuc2Zvcm1bMF1bMF0sIHRyYW5zZm9ybVswXVsxXSwKKwkJCQkJCXRyYW5zZm9ybVsxXVswXSwgdHJhbnNmb3JtWzFdWzFdKQorCQkJZWxpZiB0cmFuc2Zvcm1bMF1bMF0gPD4gdHJhbnNmb3JtWzFdWzFdOgorCQkJCWZsYWdzID0gZmxhZ3MgfCBXRV9IQVZFX0FOX1hfQU5EX1lfU0NBTEUKKwkJCQlkYXRhID0gZGF0YSArIHN0cnVjdC5wYWNrKCI+aGgiLCAKKwkJCQkJCXRyYW5zZm9ybVswXVswXSwgdHJhbnNmb3JtWzFdWzFdKQorCQkJZWxzZToKKwkJCQlmbGFncyA9IGZsYWdzIHwgV0VfSEFWRV9BX1NDQUxFCisJCQkJZGF0YSA9IGRhdGEgKyBzdHJ1Y3QucGFjaygiPmgiLCAKKwkJCQkJCXRyYW5zZm9ybVswXVswXSkKKwkJCisJCWdseXBoSUQgPSBnbHlmVGFibGUuZ2V0R2x5cGhJRChzZWxmLmdseXBoTmFtZSkKKwkJcmV0dXJuIHN0cnVjdC5wYWNrKCI+SEgiLCBmbGFncywgZ2x5cGhJRCkgKyBkYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJYXR0cnMgPSBbKCJnbHlwaE5hbWUiLCBzZWxmLmdseXBoTmFtZSldCisJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJmaXJzdHB0Iik6CisJCQlhdHRycyA9IGF0dHJzICsgWygieCIsIHNlbGYueCksICgieSIsIHNlbGYueSldCisJCWVsc2U6CisJCQlhdHRycyA9IGF0dHJzICsgWygiZmlyc3RwdCIsIHNlbGYuZmlyc3RwdCksICgic2Vjb25kcHQiLCBzZWxmLnNlY29uZHB0KV0KKwkJCisJCWlmIGhhc2F0dHIoc2VsZiwgInRyYW5zZm9ybSIpOgorCQkJIyBYWFggbmVlZHMgbW9yZSB0ZXN0aW5nCisJCQl0cmFuc2Zvcm0gPSBzZWxmLnRyYW5zZm9ybQorCQkJaWYgdHJhbnNmb3JtWzBdWzFdIG9yIHRyYW5zZm9ybVsxXVswXToKKwkJCQlhdHRycyA9IGF0dHJzICsgWworCQkJCQkJKCJzY2FsZXgiLCB0cmFuc2Zvcm1bMF1bMF0pLCAoInNjYWxlMDEiLCB0cmFuc2Zvcm1bMF1bMV0pLAorCQkJCQkJKCJzY2FsZTEwIiwgdHJhbnNmb3JtWzFdWzBdKSwgKCJzY2FsZXkiLCB0cmFuc2Zvcm1bMV1bMV0pLAorCQkJCQkJXQorCQkJZWxpZiB0cmFuc2Zvcm1bMF1bMF0gPD4gdHJhbnNmb3JtWzFdWzFdOgorCQkJCWF0dHJzID0gYXR0cnMgKyBbCisJCQkJCQkoInNjYWxleCIsIHRyYW5zZm9ybVswXVswXSksICgic2NhbGV5IiwgdHJhbnNmb3JtWzFdWzFdKSwKKwkJCQkJCV0KKwkJCWVsc2U6CisJCQkJYXR0cnMgPSBhdHRycyArIFsoInNjYWxlIiwgdHJhbnNmb3JtWzBdWzBdKV0KKwkJYXR0cnMgPSBhdHRycyArIFsoImZsYWdzIiwgaGV4KHNlbGYuZmxhZ3MpKV0KKwkJd3JpdGVyLnNpbXBsZXRhZygiY29tcG9uZW50IiwgYXR0cnMpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZWxmLmdseXBoTmFtZSA9IGF0dHJzWyJnbHlwaE5hbWUiXQorCQlpZiBhdHRycy5oYXNfa2V5KCJmaXJzdHB0Iik6CisJCQlzZWxmLmZpcnN0cHQgPSBzYWZlRXZhbChhdHRyc1siZmlyc3RwdCJdKQorCQkJc2VsZi5zZWNvbmRwdCA9IHNhZmVFdmFsKGF0dHJzWyJzZWNvbmRwdCJdKQorCQllbHNlOgorCQkJc2VsZi54ID0gc2FmZUV2YWwoYXR0cnNbIngiXSkKKwkJCXNlbGYueSA9IHNhZmVFdmFsKGF0dHJzWyJ5Il0pCisJCWlmIGF0dHJzLmhhc19rZXkoInNjYWxlMDEiKToKKwkJCXNjYWxleCA9IHNhZmVFdmFsKGF0dHJzWyJzY2FsZXgiXSkKKwkJCXNjYWxlMDEgPSBzYWZlRXZhbChhdHRyc1sic2NhbGUwMSJdKQorCQkJc2NhbGUxMCA9IHNhZmVFdmFsKGF0dHJzWyJzY2FsZTEwIl0pCisJCQlzY2FsZXkgPSBzYWZlRXZhbChhdHRyc1sic2NhbGV5Il0pCisJCQlzZWxmLnRyYW5zZm9ybSA9IE51bWVyaWMuYXJyYXkoW1tzY2FsZXgsIHNjYWxlMDFdLCBbc2NhbGUxMCwgc2NhbGV5XV0pCisJCWVsaWYgYXR0cnMuaGFzX2tleSgic2NhbGV4Iik6CisJCQlzY2FsZXggPSBzYWZlRXZhbChhdHRyc1sic2NhbGV4Il0pCisJCQlzY2FsZXkgPSBzYWZlRXZhbChhdHRyc1sic2NhbGV5Il0pCisJCQlzZWxmLnRyYW5zZm9ybSA9IE51bWVyaWMuYXJyYXkoW1tzY2FsZXgsIDBdLCBbMCwgc2NhbGV5XV0pCisJCWVsaWYgYXR0cnMuaGFzX2tleSgic2NhbGUiKToKKwkJCXNjYWxlID0gc2FmZUV2YWwoYXR0cnNbInNjYWxlIl0pCisJCQlzZWxmLnRyYW5zZm9ybSA9IE51bWVyaWMuYXJyYXkoW1tzY2FsZSwgMF0sIFswLCBzY2FsZV1dKQorCQlzZWxmLmZsYWdzID0gc2FmZUV2YWwoYXR0cnNbImZsYWdzIl0pCisJCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQlpZiBoYXNhdHRyKHNlbGYsICJ0cmFuc2Zvcm0iKToKKwkJCWlmIE51bWVyaWMuYWxsdHJ1ZShOdW1lcmljLmVxdWFsKHNlbGYudHJhbnNmb3JtLCBvdGhlci50cmFuc2Zvcm0pKToKKwkJCQlzZWxmZGljdCA9IHNlbGYuX19kaWN0X18uY29weSgpCisJCQkJb3RoZXJkaWN0ID0gb3RoZXIuX19kaWN0X18uY29weSgpCisJCQkJZGVsIHNlbGZkaWN0WyJ0cmFuc2Zvcm0iXQorCQkJCWRlbCBvdGhlcmRpY3RbInRyYW5zZm9ybSJdCisJCQkJcmV0dXJuIGNtcChzZWxmZGljdCwgb3RoZXJkaWN0KQorCQkJZWxzZToKKwkJCQlyZXR1cm4gMQorCQllbHNlOgorCQkJcmV0dXJuIGNtcChzZWxmLl9fZGljdF9fLCBvdGhlci5fX2RpY3RfXykKKworCitkZWYgcmVwcmZsYWcoZmxhZyk6CisJYmluID0gIiIKKwlpZiB0eXBlKGZsYWcpID09IHR5cGVzLlN0cmluZ1R5cGU6CisJCWZsYWcgPSBvcmQoZmxhZykKKwl3aGlsZSBmbGFnOgorCQlpZiBmbGFnICYgMHgwMToKKwkJCWJpbiA9ICIxIiArIGJpbgorCQllbHNlOgorCQkJYmluID0gIjAiICsgYmluCisJCWZsYWcgPSBmbGFnID4+IDEKKwliaW4gPSAoMTQgLSBsZW4oYmluKSkgKiAiMCIgKyBiaW4KKwlyZXR1cm4gYmluCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19oX2RfbV94LnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2hfZF9tX3gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjMzk2YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19oX2RfbV94LnB5CkBAIC0wLDAgKzEsOTUgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBzc3RydWN0CitpbXBvcnQgc3RyaW5nCisKK2hkbXhIZWFkZXJGb3JtYXQgPSAiIiIKKwl2ZXJzaW9uOglICisJbnVtUmVjb3JkczoJSAorCXJlY29yZFNpemU6CWwKKyIiIgorCitjbGFzcyB0YWJsZV9faF9kX21feChEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKToKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIHR0Rm9udCk6CisJCW51bUdseXBocyA9IHR0Rm9udFsnbWF4cCddLm51bUdseXBocworCQlnbHlwaE9yZGVyID0gdHRGb250LmdldEdseXBoT3JkZXIoKQorCQlkdW1teSwgZGF0YSA9IHNzdHJ1Y3QudW5wYWNrMihoZG14SGVhZGVyRm9ybWF0LCBkYXRhLCBzZWxmKQorCQlzZWxmLmhkbXggPSB7fQorCQlmb3IgaSBpbiByYW5nZShzZWxmLm51bVJlY29yZHMpOgorCQkJcHBlbSA9IG9yZChkYXRhWzBdKQorCQkJbWF4U2l6ZSA9IG9yZChkYXRhWzFdKQorCQkJd2lkdGhzID0ge30KKwkJCWZvciBnbHlwaElEIGluIHJhbmdlKG51bUdseXBocyk6CisJCQkJd2lkdGhzW2dseXBoT3JkZXJbZ2x5cGhJRF1dID0gb3JkKGRhdGFbZ2x5cGhJRCsyXSkKKwkJCXNlbGYuaGRteFtwcGVtXSA9IHdpZHRocworCQkJZGF0YSA9IGRhdGFbc2VsZi5yZWNvcmRTaXplOl0KKwkJYXNzZXJ0IGxlbihkYXRhKSA9PSAwLCAidG9vIG11Y2ggaGRteCBkYXRhIgorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXNlbGYudmVyc2lvbiA9IDAKKwkJbnVtR2x5cGhzID0gdHRGb250WydtYXhwJ10ubnVtR2x5cGhzCisJCWdseXBoT3JkZXIgPSB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpCisJCXNlbGYucmVjb3JkU2l6ZSA9IDQgKiAoKDIgKyBudW1HbHlwaHMgKyAzKSAvIDQpCisJCXBhZCA9IChzZWxmLnJlY29yZFNpemUgLSAyIC0gbnVtR2x5cGhzKSAqICJcMCIKKwkJc2VsZi5udW1SZWNvcmRzID0gbGVuKHNlbGYuaGRteCkKKwkJZGF0YSA9IHNzdHJ1Y3QucGFjayhoZG14SGVhZGVyRm9ybWF0LCBzZWxmKQorCQlpdGVtcyA9IHNlbGYuaGRteC5pdGVtcygpCisJCWl0ZW1zLnNvcnQoKQorCQlmb3IgcHBlbSwgd2lkdGhzIGluIGl0ZW1zOgorCQkJZGF0YSA9IGRhdGEgKyBjaHIocHBlbSkgKyBjaHIobWF4KHdpZHRocy52YWx1ZXMoKSkpCisJCQlmb3IgZ2x5cGhJRCBpbiByYW5nZShsZW4oZ2x5cGhPcmRlcikpOgorCQkJCXdpZHRoID0gd2lkdGhzW2dseXBoT3JkZXJbZ2x5cGhJRF1dCisJCQkJZGF0YSA9IGRhdGEgKyBjaHIod2lkdGgpCisJCQlkYXRhID0gZGF0YSArIHBhZAorCQlyZXR1cm4gZGF0YQorCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCXdyaXRlci5iZWdpbnRhZygiaGRteERhdGEiKQorCQl3cml0ZXIubmV3bGluZSgpCisJCXBwZW1zID0gc2VsZi5oZG14LmtleXMoKQorCQlwcGVtcy5zb3J0KCkKKwkJcmVjb3JkcyA9IFtdCisJCWZvcm1hdCA9ICIiCisJCWZvciBwcGVtIGluIHBwZW1zOgorCQkJd2lkdGhzID0gc2VsZi5oZG14W3BwZW1dCisJCQlyZWNvcmRzLmFwcGVuZCh3aWR0aHMpCisJCQlmb3JtYXQgPSBmb3JtYXQgKyAiJTRkIgorCQlnbHlwaE5hbWVzID0gdHRGb250LmdldEdseXBoT3JkZXIoKVs6XQorCQlnbHlwaE5hbWVzLnNvcnQoKQorCQltYXhOYW1lTGVuID0gbWF4KG1hcChsZW4sIGdseXBoTmFtZXMpKQorCQlmb3JtYXQgPSAiJSIgKyBgbWF4TmFtZUxlbmAgKyAnczonICsgZm9ybWF0ICsgJyA7JworCQl3cml0ZXIud3JpdGUoZm9ybWF0ICUgKCgicHBlbSIsKSArIHR1cGxlKHBwZW1zKSkpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQlmb3IgZ2x5cGhOYW1lIGluIGdseXBoTmFtZXM6CisJCQlyb3cgPSBbXQorCQkJZm9yIHBwZW0gaW4gcHBlbXM6CisJCQkJd2lkdGhzID0gc2VsZi5oZG14W3BwZW1dCisJCQkJcm93LmFwcGVuZCh3aWR0aHNbZ2x5cGhOYW1lXSkKKwkJCXdyaXRlci53cml0ZShmb3JtYXQgJSAoKGdseXBoTmFtZSwpICsgdHVwbGUocm93KSkpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCXdyaXRlci5lbmR0YWcoImhkbXhEYXRhIikKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIHR0Rm9udCk6CisJCWlmIG5hbWUgPD4gImhkbXhEYXRhIjoKKwkJCXJldHVybgorCQljb250ZW50ID0gc3RyaW5nLmpvaW4oY29udGVudCwgIiAiKQorCQlsaW5lcyA9IHN0cmluZy5zcGxpdChjb250ZW50LCAiOyIpCisJCXRvcFJvdyA9IHN0cmluZy5zcGxpdChsaW5lc1swXSkKKwkJYXNzZXJ0IHRvcFJvd1swXSA9PSAicHBlbToiLCAiaWxsZWdhbCBoZG14IGZvcm1hdCIKKwkJcHBlbXMgPSBtYXAoaW50LCB0b3BSb3dbMTpdKQorCQlzZWxmLmhkbXggPSBoZG14ID0ge30KKwkJZm9yIHBwZW0gaW4gcHBlbXM6CisJCQloZG14W3BwZW1dID0ge30KKwkJbGluZXMgPSBtYXAoc3RyaW5nLnNwbGl0LCBsaW5lc1sxOl0pCisJCWZvciBsaW5lIGluIGxpbmVzOgorCQkJaWYgbm90IGxpbmU6CisJCQkJY29udGludWUKKwkJCWFzc2VydCBsaW5lWzBdWy0xXSA9PSAiOiIsICJpbGxlZ2FsIGhkbXggZm9ybWF0IgorCQkJZ2x5cGhOYW1lID0gbGluZVswXVs6LTFdCisJCQlsaW5lID0gbWFwKGludCwgbGluZVsxOl0pCisJCQlhc3NlcnQgbGVuKGxpbmUpID09IGxlbihwcGVtcyksICJpbGxlZ2FsIGhkbXggZm9ybWF0IgorCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHBwZW1zKSk6CisJCQkJaGRteFtwcGVtc1tpXV1bZ2x5cGhOYW1lXSA9IGxpbmVbaV0KKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2hfZV9hX2QucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9faF9lX2FfZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzMzZWRiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2hfZV9hX2QucHkKQEAgLTAsMCArMSwxMzYgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBzc3RydWN0CitpbXBvcnQgdGltZQoraW1wb3J0IHN0cmluZworaW1wb3J0IGNhbGVuZGFyCitmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwsIG51bTJiaW5hcnksIGJpbmFyeTJudW0KKworCitoZWFkRm9ybWF0ID0gIiIiCisJCT4JIyBiaWcgZW5kaWFuCisJCXRhYmxlVmVyc2lvbjoJCTE2LjE2RgorCQlmb250UmV2aXNpb246CQkxNi4xNkYKKwkJY2hlY2tTdW1BZGp1c3RtZW50OglsCisJCW1hZ2ljTnVtYmVyOgkJbAorCQkJCQkJCXgJIyBwYWQgYnl0ZQorCQlmbGFnczoJCQkJYgorCQl1bml0c1BlckVtOgkJCUgKKwkJY3JlYXRlZDoJCQk4cworCQltb2RpZmllZDoJCQk4cworCQl4TWluOgkJCQloCisJCXlNaW46CQkJCWgKKwkJeE1heDoJCQkJaAorCQl5TWF4OgkJCQloCisJCW1hY1N0eWxlOgkJCUgKKwkJbG93ZXN0UmVjUFBFTToJCUgKKwkJZm9udERpcmVjdGlvbkhpbnQ6CWgKKwkJaW5kZXhUb0xvY0Zvcm1hdDoJaAorCQlnbHlwaERhdGFGb3JtYXQ6CWgKKyIiIgorCitjbGFzcyB0YWJsZV9faF9lX2FfZChEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKToKKwkKKwlkZXBlbmRlbmNpZXMgPSBbJ21heHAnLCAnbG9jYSddCisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlzc3RydWN0LnVucGFjayhoZWFkRm9ybWF0LCBkYXRhLCBzZWxmKQorCQlzZWxmLnVuaXRzUGVyRW0gPSBpbnQoc2VsZi51bml0c1BlckVtKQorCQlzZWxmLnN0cmluZ3MyZGF0ZXMoKQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXNlbGYubW9kaWZpZWQgPSBsb25nKHRpbWUudGltZSgpIC0gbWFjX2Vwb2NoX2RpZmYpCisJCXNlbGYuZGF0ZXMyc3RyaW5ncygpCisJCWRhdGEgPSBzc3RydWN0LnBhY2soaGVhZEZvcm1hdCwgc2VsZikKKwkJc2VsZi5zdHJpbmdzMmRhdGVzKCkKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgc3RyaW5nczJkYXRlcyhzZWxmKToKKwkJc2VsZi5jcmVhdGVkID0gYmluMmxvbmcoc2VsZi5jcmVhdGVkKQorCQlzZWxmLm1vZGlmaWVkID0gYmluMmxvbmcoc2VsZi5tb2RpZmllZCkKKwkKKwlkZWYgZGF0ZXMyc3RyaW5ncyhzZWxmKToKKwkJc2VsZi5jcmVhdGVkID0gbG9uZzJiaW4oc2VsZi5jcmVhdGVkKQorCQlzZWxmLm1vZGlmaWVkID0gbG9uZzJiaW4oc2VsZi5tb2RpZmllZCkKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQl3cml0ZXIuY29tbWVudCgiTW9zdCBvZiB0aGlzIHRhYmxlIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciIpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkJZm9ybWF0c3RyaW5nLCBuYW1lcywgZml4ZXMgPSBzc3RydWN0LmdldGZvcm1hdChoZWFkRm9ybWF0KQorCQlmb3IgbmFtZSBpbiBuYW1lczoKKwkJCXZhbHVlID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorCQkJaWYgbmFtZSBpbiAoImNyZWF0ZWQiLCAibW9kaWZpZWQiKToKKwkJCQl2YWx1ZSA9IHRpbWUuYXNjdGltZSh0aW1lLmdtdGltZShtYXgoMCwgdmFsdWUgKyBtYWNfZXBvY2hfZGlmZikpKQorCQkJaWYgdHlwZSh2YWx1ZSkgPT0gdHlwZSgwTCk6CisJCQkJdmFsdWU9aW50KHZhbHVlKQorCQkJaWYgbmFtZSBpbiAoIm1hZ2ljTnVtYmVyIiwgImNoZWNrU3VtQWRqdXN0bWVudCIpOgorCQkJCXZhbHVlID0gaGV4KHZhbHVlKQorCQkJZWxpZiBuYW1lID09ICJmbGFncyI6CisJCQkJdmFsdWUgPSBudW0yYmluYXJ5KHZhbHVlLCAxNikKKwkJCXdyaXRlci5zaW1wbGV0YWcobmFtZSwgdmFsdWU9dmFsdWUpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJdmFsdWUgPSBhdHRyc1sidmFsdWUiXQorCQlpZiBuYW1lIGluICgiY3JlYXRlZCIsICJtb2RpZmllZCIpOgorCQkJdmFsdWUgPSBwYXJzZV9kYXRlKHZhbHVlKSAtIG1hY19lcG9jaF9kaWZmCisJCWVsaWYgbmFtZSA9PSAiZmxhZ3MiOgorCQkJdmFsdWUgPSBiaW5hcnkybnVtKHZhbHVlKQorCQllbHNlOgorCQkJdmFsdWUgPSBzYWZlRXZhbCh2YWx1ZSkKKwkJc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkKKwkKKwlkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisJCXNlbGZkaWN0ID0gc2VsZi5fX2RpY3RfXy5jb3B5KCkKKwkJb3RoZXJkaWN0ID0gb3RoZXIuX19kaWN0X18uY29weSgpCisJCSMgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGNvbXBhcmUgd2l0aG91dCB0aGUgbW9kaWZpZWQgYW5kIGNoZWNrU3VtQWRqdXN0bWVudAorCQkjIGZpZWxkcywgc2luY2UgdGhleSBhcmUgYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQuCisJCWZvciBrZXkgaW4gWyJtb2RpZmllZCIsICJjaGVja1N1bUFkanVzdG1lbnQiXToKKwkJCWRlbCBzZWxmZGljdFtrZXldCisJCQlkZWwgb3RoZXJkaWN0W2tleV0KKwkJcmV0dXJuIGNtcChzZWxmZGljdCwgb3RoZXJkaWN0KQorCisKK2RlZiBjYWxjX21hY19lcG9jaF9kaWZmKCk6CisJIiIiY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9yaWdpbmFsIE1hYyBlcG9jaCAoMTkwNCkKKwl0byB0aGUgZXBvY2ggb24gdGhpcyBtYWNoaW5lLgorCSIiIgorCXNhZmVfZXBvY2hfdCA9ICgxOTcxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwKQorCXNhZmVfZXBvY2ggPSB0aW1lLm1rdGltZShzYWZlX2Vwb2NoX3QpIC0gdGltZS50aW1lem9uZQorCWFzc2VydCB0aW1lLmdtdGltZShzYWZlX2Vwb2NoKVs6Nl0gPT0gc2FmZV9lcG9jaF90Wzo2XQorCXNlY29uZHMxOTA0dG8xOTcxID0gNjAgKiA2MCAqIDI0ICogKDM2NSAqICgxOTcxLTE5MDQpICsgMTcpICMgdGhhbmtzLCBMYXVyZW5jZSEKKwlyZXR1cm4gbG9uZyhzYWZlX2Vwb2NoIC0gc2Vjb25kczE5MDR0bzE5NzEpCisKK21hY19lcG9jaF9kaWZmID0gY2FsY19tYWNfZXBvY2hfZGlmZigpCisKKworX21vbnRocyA9IG1hcChzdHJpbmcubG93ZXIsIGNhbGVuZGFyLm1vbnRoX2FiYnIpCitfd2Vla2RheXMgPSBtYXAoc3RyaW5nLmxvd2VyLCBjYWxlbmRhci5kYXlfYWJicikKKworZGVmIHBhcnNlX2RhdGUoZGF0ZXN0cmluZyk6CisJZGF0ZXN0cmluZyA9IHN0cmluZy5sb3dlcihkYXRlc3RyaW5nKQorCXdlZWtkYXksIG1vbnRoLCBkYXksIHRpbSwgeWVhciA9IHN0cmluZy5zcGxpdChkYXRlc3RyaW5nKQorCXdlZWtkYXkgPSBfd2Vla2RheXMuaW5kZXgod2Vla2RheSkKKwltb250aCA9IF9tb250aHMuaW5kZXgobW9udGgpCisJeWVhciA9IGludCh5ZWFyKQorCWRheSA9IGludChkYXkpCisJaG91ciwgbWludXRlLCBzZWNvbmQgPSBtYXAoaW50LCBzdHJpbmcuc3BsaXQodGltLCAiOiIpKQorCXQgPSAoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIHdlZWtkYXksIDAsIDApCisJcmV0dXJuIGxvbmcodGltZS5ta3RpbWUodCkgLSB0aW1lLnRpbWV6b25lKQorCisKK2RlZiBiaW4ybG9uZyhkYXRhKToKKwkjIHRoYW5rcyA8L0Y+IQorCXYgPSAwTAorCWZvciBpIGluIG1hcChvcmQsIGRhdGEpOgorCSAgICB2ID0gdjw8OCB8IGkKKwlyZXR1cm4gdgorCitkZWYgbG9uZzJiaW4odiwgYnl0ZXM9OCk6CisJZGF0YSA9ICIiCisJd2hpbGUgdjoKKwkJZGF0YSA9IGNocih2ICYgMHhmZikgKyBkYXRhCisJCXYgPSB2ID4+IDgKKwlkYXRhID0gKGJ5dGVzIC0gbGVuKGRhdGEpKSAqICJcMCIgKyBkYXRhCisJYXNzZXJ0IGxlbihkYXRhKSA9PSA4LCAibG9uZyB0b28gbG9uZyIKKwlyZXR1cm4gZGF0YQorCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9faF9oX2VfYS5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19oX2hfZV9hLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTc1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9faF9oX2VfYS5weQpAQCAtMCwwICsxLDc4IEBACitpbXBvcnQgRGVmYXVsdFRhYmxlCitpbXBvcnQgc3N0cnVjdAorZnJvbSBmb250VG9vbHMubWlzYy50ZXh0VG9vbHMgaW1wb3J0IHNhZmVFdmFsCisKK2hoZWFGb3JtYXQgPSAiIiIKKwkJPgkjIGJpZyBlbmRpYW4KKwkJdGFibGVWZXJzaW9uOgkJCTE2LjE2RgorCQlhc2NlbnQ6CQkJCQloCisJCWRlc2NlbnQ6CQkJCWgKKwkJbGluZUdhcDoJCQkJaAorCQlhZHZhbmNlV2lkdGhNYXg6CQlICisJCW1pbkxlZnRTaWRlQmVhcmluZzoJCWgKKwkJbWluUmlnaHRTaWRlQmVhcmluZzoJaAorCQl4TWF4RXh0ZW50OgkJCQloCisJCWNhcmV0U2xvcGVSaXNlOgkJCWgKKwkJY2FyZXRTbG9wZVJ1bjoJCQloCisJCXJlc2VydmVkMDoJCQkJaAorCQlyZXNlcnZlZDE6CQkJCWgKKwkJcmVzZXJ2ZWQyOgkJCQloCisJCXJlc2VydmVkMzoJCQkJaAorCQlyZXNlcnZlZDQ6CQkJCWgKKwkJbWV0cmljRGF0YUZvcm1hdDoJCWgKKwkJbnVtYmVyT2ZITWV0cmljczoJCUgKKyIiIgorCitjbGFzcyB0YWJsZV9faF9oX2VfYShEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKToKKwkKKwlkZXBlbmRlbmNpZXMgPSBbJ2htdHgnLCAnZ2x5ZiddCisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlzc3RydWN0LnVucGFjayhoaGVhRm9ybWF0LCBkYXRhLCBzZWxmKQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXNlbGYucmVjYWxjKHR0Rm9udCkKKwkJcmV0dXJuIHNzdHJ1Y3QucGFjayhoaGVhRm9ybWF0LCBzZWxmKQorCQorCWRlZiByZWNhbGMoc2VsZiwgdHRGb250KToKKwkJaG10eFRhYmxlID0gdHRGb250WydobXR4J10KKwkJaWYgdHRGb250Lmhhc19rZXkoJ2dseWYnKToKKwkJCWlmIG5vdCB0dEZvbnQuaXNMb2FkZWQoJ2dseWYnKToKKwkJCQlyZXR1cm4KKwkJCWdseWZUYWJsZSA9IHR0Rm9udFsnZ2x5ZiddCisJCQlhZHZhbmNlV2lkdGhNYXggPSAtMTAwMDAwICAgICMgYXJiaXRyYXJ5IGJpZyBuZWdhdGl2ZSBudW1iZXIKKwkJCW1pbkxlZnRTaWRlQmVhcmluZyA9IDEwMDAwMCAgIyBhcmJpdHJhcnkgYmlnIG51bWJlcgorCQkJbWluUmlnaHRTaWRlQmVhcmluZyA9IDEwMDAwMCAjIGFyYml0cmFyeSBiaWcgbnVtYmVyCisJCQl4TWF4RXh0ZW50ID0gLTEwMDAwMCAgICAgICAgICMgYXJiaXRyYXJ5IGJpZyBuZWdhdGl2ZSBudW1iZXIKKwkJCQorCQkJZm9yIG5hbWUgaW4gdHRGb250LmdldEdseXBoT3JkZXIoKToKKwkJCQl3aWR0aCwgbHNiID0gaG10eFRhYmxlW25hbWVdCisJCQkJZyA9IGdseWZUYWJsZVtuYW1lXQorCQkJCWlmIGcubnVtYmVyT2ZDb250b3VycyA8PSAwOgorCQkJCQljb250aW51ZQorCQkJCWFkdmFuY2VXaWR0aE1heCA9IG1heChhZHZhbmNlV2lkdGhNYXgsIHdpZHRoKQorCQkJCW1pbkxlZnRTaWRlQmVhcmluZyA9IG1pbihtaW5MZWZ0U2lkZUJlYXJpbmcsIGxzYikKKwkJCQlyc2IgPSB3aWR0aCAtIGxzYiAtIChnLnhNYXggLSBnLnhNaW4pCisJCQkJbWluUmlnaHRTaWRlQmVhcmluZyA9IG1pbihtaW5SaWdodFNpZGVCZWFyaW5nLCByc2IpCisJCQkJZXh0ZW50ID0gbHNiICsgKGcueE1heCAtIGcueE1pbikKKwkJCQl4TWF4RXh0ZW50ID0gbWF4KHhNYXhFeHRlbnQsIGV4dGVudCkKKwkJCXNlbGYuYWR2YW5jZVdpZHRoTWF4ID0gYWR2YW5jZVdpZHRoTWF4CisJCQlzZWxmLm1pbkxlZnRTaWRlQmVhcmluZyA9IG1pbkxlZnRTaWRlQmVhcmluZworCQkJc2VsZi5taW5SaWdodFNpZGVCZWFyaW5nID0gbWluUmlnaHRTaWRlQmVhcmluZworCQkJc2VsZi54TWF4RXh0ZW50ID0geE1heEV4dGVudAorCQllbHNlOgorCQkJIyBYWFggQ0ZGIHJlY2FsYy4uLgorCQkJcGFzcworCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCWZvcm1hdHN0cmluZywgbmFtZXMsIGZpeGVzID0gc3N0cnVjdC5nZXRmb3JtYXQoaGhlYUZvcm1hdCkKKwkJZm9yIG5hbWUgaW4gbmFtZXM6CisJCQl2YWx1ZSA9IGdldGF0dHIoc2VsZiwgbmFtZSkKKwkJCWlmIHR5cGUodmFsdWUpID09IHR5cGUoMEwpOgorCQkJCXZhbHVlID0gaW50KHZhbHVlKQorCQkJd3JpdGVyLnNpbXBsZXRhZyhuYW1lLCB2YWx1ZT12YWx1ZSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZXRhdHRyKHNlbGYsIG5hbWUsIHNhZmVFdmFsKGF0dHJzWyJ2YWx1ZSJdKSkKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2hfbV90X3gucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9faF9tX3RfeC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZhOGNkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2hfbV90X3gucHkKQEAgLTAsMCArMSw5NCBAQAoraW1wb3J0IERlZmF1bHRUYWJsZQoraW1wb3J0IE51bWVyaWMKK2Zyb20gZm9udFRvb2xzIGltcG9ydCB0dExpYgorZnJvbSBmb250VG9vbHMubWlzYy50ZXh0VG9vbHMgaW1wb3J0IHNhZmVFdmFsCisKKworY2xhc3MgdGFibGVfX2hfbV90X3goRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJaGVhZGVyVGFnID0gJ2hoZWEnCisJYWR2YW5jZU5hbWUgPSAnd2lkdGgnCisJc2lkZUJlYXJpbmdOYW1lID0gJ2xzYicKKwludW1iZXJPZk1ldHJpY3NOYW1lID0gJ251bWJlck9mSE1ldHJpY3MnCisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQludW1iZXJPZk1ldHJpY3MgPSBpbnQoZ2V0YXR0cih0dEZvbnRbc2VsZi5oZWFkZXJUYWddLCBzZWxmLm51bWJlck9mTWV0cmljc05hbWUpKQorCQltZXRyaWNzID0gTnVtZXJpYy5mcm9tc3RyaW5nKGRhdGFbOjQgKiBudW1iZXJPZk1ldHJpY3NdLCAKKwkJCQlOdW1lcmljLkludDE2KQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQltZXRyaWNzID0gbWV0cmljcy5ieXRlc3dhcHBlZCgpCisJCW1ldHJpY3Muc2hhcGUgPSAobnVtYmVyT2ZNZXRyaWNzLCAyKQorCQlkYXRhID0gZGF0YVs0ICogbnVtYmVyT2ZNZXRyaWNzOl0KKwkJbnVtYmVyT2ZTaWRlQmVhcmluZ3MgPSB0dEZvbnRbJ21heHAnXS5udW1HbHlwaHMgLSBudW1iZXJPZk1ldHJpY3MKKwkJbnVtYmVyT2ZTaWRlQmVhcmluZ3MgPSBpbnQobnVtYmVyT2ZTaWRlQmVhcmluZ3MpCisJCWlmIG51bWJlck9mU2lkZUJlYXJpbmdzOgorCQkJYXNzZXJ0IG51bWJlck9mU2lkZUJlYXJpbmdzID4gMCwgImJhZCBobXR4L3ZtdHggdGFibGUiCisJCQlsYXN0QWR2YW5jZSA9IG1ldHJpY3NbLTFdWzBdCisJCQlhZHZhbmNlcyA9IE51bWVyaWMuYXJyYXkoW2xhc3RBZHZhbmNlXSAqIG51bWJlck9mU2lkZUJlYXJpbmdzLCAKKwkJCQkJTnVtZXJpYy5JbnQxNikKKwkJCXNpZGVCZWFyaW5ncyA9IE51bWVyaWMuZnJvbXN0cmluZyhkYXRhWzoyICogbnVtYmVyT2ZTaWRlQmVhcmluZ3NdLCAKKwkJCQkJTnVtZXJpYy5JbnQxNikKKwkJCWlmIHR0TGliLmVuZGlhbiA8PiAiYmlnIjoKKwkJCQlzaWRlQmVhcmluZ3MgPSBzaWRlQmVhcmluZ3MuYnl0ZXN3YXBwZWQoKQorCQkJZGF0YSA9IGRhdGFbMiAqIG51bWJlck9mU2lkZUJlYXJpbmdzOl0KKwkJCWFkZGl0aW9uYWxNZXRyaWNzID0gTnVtZXJpYy5hcnJheShbYWR2YW5jZXMsIHNpZGVCZWFyaW5nc10sIAorCQkJCQlOdW1lcmljLkludDE2KQorCQkJbWV0cmljcyA9IE51bWVyaWMuY29uY2F0ZW5hdGUoKG1ldHJpY3MsIAorCQkJCQlOdW1lcmljLnRyYW5zcG9zZShhZGRpdGlvbmFsTWV0cmljcykpKQorCQlpZiBkYXRhOgorCQkJcmFpc2UgIHR0TGliLlRUTGliRXJyb3IsICJ0b28gbXVjaCBkYXRhIGZvciBobXR4L3ZtdHggdGFibGUiCisJCW1ldHJpY3MgPSBtZXRyaWNzLnRvbGlzdCgpCisJCXNlbGYubWV0cmljcyA9IHt9CisJCWZvciBpIGluIHJhbmdlKGxlbihtZXRyaWNzKSk6CisJCQlnbHlwaE5hbWUgPSB0dEZvbnQuZ2V0R2x5cGhOYW1lKGkpCisJCQlzZWxmLm1ldHJpY3NbZ2x5cGhOYW1lXSA9IG1ldHJpY3NbaV0KKwkKKwlkZWYgY29tcGlsZShzZWxmLCB0dEZvbnQpOgorCQltZXRyaWNzID0gW10KKwkJZm9yIGdseXBoTmFtZSBpbiB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpOgorCQkJbWV0cmljcy5hcHBlbmQoc2VsZi5tZXRyaWNzW2dseXBoTmFtZV0pCisJCWxhc3RBZHZhbmNlID0gbWV0cmljc1stMV1bMF0KKwkJbGFzdEluZGV4ID0gbGVuKG1ldHJpY3MpCisJCXdoaWxlIG1ldHJpY3NbbGFzdEluZGV4LTJdWzBdID09IGxhc3RBZHZhbmNlOgorCQkJbGFzdEluZGV4ID0gbGFzdEluZGV4IC0gMQorCQlhZGRpdGlvbmFsTWV0cmljcyA9IG1ldHJpY3NbbGFzdEluZGV4Ol0KKwkJYWRkaXRpb25hbE1ldHJpY3MgPSBtYXAobGFtYmRhIChhZHZhbmNlLCBzYik6IHNiLCBhZGRpdGlvbmFsTWV0cmljcykKKwkJbWV0cmljcyA9IG1ldHJpY3NbOmxhc3RJbmRleF0KKwkJc2V0YXR0cih0dEZvbnRbc2VsZi5oZWFkZXJUYWddLCBzZWxmLm51bWJlck9mTWV0cmljc05hbWUsIGxlbihtZXRyaWNzKSkKKwkJCisJCW1ldHJpY3MgPSBOdW1lcmljLmFycmF5KG1ldHJpY3MsIE51bWVyaWMuSW50MTYpCisJCWlmIHR0TGliLmVuZGlhbiA8PiAiYmlnIjoKKwkJCW1ldHJpY3MgPSBtZXRyaWNzLmJ5dGVzd2FwcGVkKCkKKwkJZGF0YSA9IG1ldHJpY3MudG9zdHJpbmcoKQorCQkKKwkJYWRkaXRpb25hbE1ldHJpY3MgPSBOdW1lcmljLmFycmF5KGFkZGl0aW9uYWxNZXRyaWNzLCBOdW1lcmljLkludDE2KQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQlhZGRpdGlvbmFsTWV0cmljcyA9IGFkZGl0aW9uYWxNZXRyaWNzLmJ5dGVzd2FwcGVkKCkKKwkJZGF0YSA9IGRhdGEgKyBhZGRpdGlvbmFsTWV0cmljcy50b3N0cmluZygpCisJCXJldHVybiBkYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJbmFtZXMgPSBzZWxmLm1ldHJpY3Mua2V5cygpCisJCW5hbWVzLnNvcnQoKQorCQlmb3IgZ2x5cGhOYW1lIGluIG5hbWVzOgorCQkJYWR2YW5jZSwgc2IgPSBzZWxmLm1ldHJpY3NbZ2x5cGhOYW1lXQorCQkJd3JpdGVyLnNpbXBsZXRhZygibXR4IiwgWworCQkJCQkoIm5hbWUiLCBnbHlwaE5hbWUpLCAKKwkJCQkJKHNlbGYuYWR2YW5jZU5hbWUsIGFkdmFuY2UpLCAKKwkJCQkJKHNlbGYuc2lkZUJlYXJpbmdOYW1lLCBzYiksCisJCQkJCV0pCisJCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJaWYgbm90IGhhc2F0dHIoc2VsZiwgIm1ldHJpY3MiKToKKwkJCXNlbGYubWV0cmljcyA9IHt9CisJCWlmIG5hbWUgPT0gIm10eCI6CisJCQlzZWxmLm1ldHJpY3NbYXR0cnNbIm5hbWUiXV0gPSBbc2FmZUV2YWwoYXR0cnNbc2VsZi5hZHZhbmNlTmFtZV0pLCAKKwkJCQkJc2FmZUV2YWwoYXR0cnNbc2VsZi5zaWRlQmVhcmluZ05hbWVdKV0KKwkKKwlkZWYgX19nZXRpdGVtX18oc2VsZiwgZ2x5cGhOYW1lKToKKwkJcmV0dXJuIHNlbGYubWV0cmljc1tnbHlwaE5hbWVdCisJCisJZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGdseXBoTmFtZSwgKGFkdmFuY2UsIHNiKSk6CisJCXNlbGYubWV0cmljc1tnbHlwaE5hbWVdID0gYWR2YW5jZSwgc2IKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2tfZV9yX24ucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fa19lX3Jfbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNjNTJmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2tfZV9yX24ucHkKQEAgLTAsMCArMSwxODYgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0dExpYi5zZm50Citmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwsIHJlYWRIZXgKKworCitjbGFzcyB0YWJsZV9fa19lX3JfbihEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKToKKwkKKwlkZWYgZ2V0a2VybihzZWxmLCBmb3JtYXQpOgorCQlmb3Igc3VidGFibGUgaW4gc2VsZi5rZXJuVGFibGVzOgorCQkJaWYgc3VidGFibGUudmVyc2lvbiA9PSBmb3JtYXQ6CisJCQkJcmV0dXJuIHN1YnRhYmxlCisJCXJldHVybiBOb25lICAjIG5vdCBmb3VuZAorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJdmVyc2lvbiwgblRhYmxlcyA9IHN0cnVjdC51bnBhY2soIj5ISCIsIGRhdGFbOjRdKQorCQlpZiB2ZXJzaW9uID09IDE6CisJCQkjIEFwcGxlJ3MgbmV3IGZvcm1hdC4gSG0uCisJCQl2ZXJzaW9uLCBuVGFibGVzID0gc3RydWN0LnVucGFjaygiPmxsIiwgZGF0YVs6OF0pCisJCQlzZWxmLnZlcnNpb24gPSB2ZXJzaW9uIC8gZmxvYXQoMHgxMDAwMCkKKwkJCWRhdGEgPSBkYXRhWzg6XQorCQllbHNlOgorCQkJc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorCQkJZGF0YSA9IGRhdGFbNDpdCisJCXRhYmxlc0luZGV4ID0gW10KKwkJc2VsZi5rZXJuVGFibGVzID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UoblRhYmxlcyk6CisJCQl2ZXJzaW9uLCBsZW5ndGggPSBzdHJ1Y3QudW5wYWNrKCI+SEgiLCBkYXRhWzo0XSkKKwkJCWxlbmd0aCA9IGludChsZW5ndGgpCisJCQlpZiBub3Qga2Vybl9jbGFzc2VzLmhhc19rZXkodmVyc2lvbik6CisJCQkJc3VidGFibGUgPSBLZXJuVGFibGVfZm9ybWF0X3Vua293bigpCisJCQllbHNlOgorCQkJCXN1YnRhYmxlID0ga2Vybl9jbGFzc2VzW3ZlcnNpb25dKCkKKwkJCXN1YnRhYmxlLmRlY29tcGlsZShkYXRhWzpsZW5ndGhdLCB0dEZvbnQpCisJCQlzZWxmLmtlcm5UYWJsZXMuYXBwZW5kKHN1YnRhYmxlKQorCQkJZGF0YSA9IGRhdGFbbGVuZ3RoOl0KKwkKKwlkZWYgY29tcGlsZShzZWxmLCB0dEZvbnQpOgorCQluVGFibGVzID0gbGVuKHNlbGYua2VyblRhYmxlcykKKwkJaWYgc2VsZi52ZXJzaW9uID09IDEuMDoKKwkJCSMgQXBwbGUncyBuZXcgZm9ybWF0LgorCQkJZGF0YSA9IHN0cnVjdC5wYWNrKCI+bGwiLCBzZWxmLnZlcnNpb24gKiAweDEwMDAsIG5UYWJsZXMpCisJCWVsc2U6CisJCQlkYXRhID0gc3RydWN0LnBhY2soIj5ISCIsIHNlbGYudmVyc2lvbiwgblRhYmxlcykKKwkJZm9yIHN1YnRhYmxlIGluIHNlbGYua2VyblRhYmxlczoKKwkJCWRhdGEgPSBkYXRhICsgc3VidGFibGUuY29tcGlsZSh0dEZvbnQpCisJCXJldHVybiBkYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJd3JpdGVyLnNpbXBsZXRhZygidmVyc2lvbiIsIHZhbHVlPXNlbGYudmVyc2lvbikKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQlmb3Igc3VidGFibGUgaW4gc2VsZi5rZXJuVGFibGVzOgorCQkJc3VidGFibGUudG9YTUwod3JpdGVyLCB0dEZvbnQpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJaWYgbmFtZSA9PSAidmVyc2lvbiI6CisJCQlzZWxmLnZlcnNpb24gPSBzYWZlRXZhbChhdHRyc1sidmFsdWUiXSkKKwkJCXJldHVybgorCQlpZiBuYW1lIDw+ICJrZXJuc3VidGFibGUiOgorCQkJcmV0dXJuCisJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJrZXJuVGFibGVzIik6CisJCQlzZWxmLmtlcm5UYWJsZXMgPSBbXQorCQlmb3JtYXQgPSBzYWZlRXZhbChhdHRyc1siZm9ybWF0Il0pCisJCWlmIG5vdCBrZXJuX2NsYXNzZXMuaGFzX2tleShmb3JtYXQpOgorCQkJc3VidGFibGUgPSBLZXJuVGFibGVfZm9ybWF0X3Vua293bigpCisJCWVsc2U6CisJCQlzdWJ0YWJsZSA9IGtlcm5fY2xhc3Nlc1tmb3JtYXRdKCkKKwkJc2VsZi5rZXJuVGFibGVzLmFwcGVuZChzdWJ0YWJsZSkKKwkJc3VidGFibGUuZnJvbVhNTCgobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpCisKKworY2xhc3MgS2VyblRhYmxlX2Zvcm1hdF8wOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJdmVyc2lvbiwgbGVuZ3RoLCBjb3ZlcmFnZSA9IHN0cnVjdC51bnBhY2soIj5ISEgiLCBkYXRhWzo2XSkKKwkJc2VsZi52ZXJzaW9uLCBzZWxmLmNvdmVyYWdlID0gaW50KHZlcnNpb24pLCBpbnQoY292ZXJhZ2UpCisJCWRhdGEgPSBkYXRhWzY6XQorCQkKKwkJc2VsZi5rZXJuVGFibGUgPSBrZXJuVGFibGUgPSB7fQorCQkKKwkJblBhaXJzLCBzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdCA9IHN0cnVjdC51bnBhY2soIj5ISEhIIiwgZGF0YVs6OF0pCisJCWRhdGEgPSBkYXRhWzg6XQorCQkKKwkJZm9yIGsgaW4gcmFuZ2UoblBhaXJzKToKKwkJCWxlZnQsIHJpZ2h0LCB2YWx1ZSA9IHN0cnVjdC51bnBhY2soIj5ISGgiLCBkYXRhWzo2XSkKKwkJCWRhdGEgPSBkYXRhWzY6XQorCQkJbGVmdCwgcmlnaHQgPSBpbnQobGVmdCksIGludChyaWdodCkKKwkJCWtlcm5UYWJsZVsodHRGb250LmdldEdseXBoTmFtZShsZWZ0KSwgdHRGb250LmdldEdseXBoTmFtZShyaWdodCkpXSA9IHZhbHVlCisJCWFzc2VydCBsZW4oZGF0YSkgPT0gMAorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCW5QYWlycyA9IGxlbihzZWxmLmtlcm5UYWJsZSkKKwkJZW50cnlTZWxlY3RvciA9IHR0TGliLnNmbnQubWF4cG93ZXJvZnR3byhuUGFpcnMpCisJCXNlYXJjaFJhbmdlID0gKDIgKiogZW50cnlTZWxlY3RvcikgKiA2CisJCXJhbmdlU2hpZnQgPSAoblBhaXJzIC0gKDIgKiogZW50cnlTZWxlY3RvcikpICogNgorCQlkYXRhID0gc3RydWN0LnBhY2soIj5ISEhIIiwgblBhaXJzLCBzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdCkKKwkJCisJCSMgeWVlaGVlISAoSSBtZWFuLCB0dXJuIG5hbWVzIGludG8gaW5kaWNlcykKKwkJa2VyblRhYmxlID0gbWFwKGxhbWJkYSAoKGxlZnQsIHJpZ2h0KSwgdmFsdWUpLCBnZXRHbHlwaElEPXR0Rm9udC5nZXRHbHlwaElEOgorCQkJCQkoZ2V0R2x5cGhJRChsZWZ0KSwgZ2V0R2x5cGhJRChyaWdodCksIHZhbHVlKSwgCisJCQkJc2VsZi5rZXJuVGFibGUuaXRlbXMoKSkKKwkJa2VyblRhYmxlLnNvcnQoKQorCQlmb3IgbGVmdCwgcmlnaHQsIHZhbHVlIGluIGtlcm5UYWJsZToKKwkJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIj5ISGgiLCBsZWZ0LCByaWdodCwgdmFsdWUpCisJCXJldHVybiBzdHJ1Y3QucGFjaygiPkhISCIsIHNlbGYudmVyc2lvbiwgbGVuKGRhdGEpICsgNiwgc2VsZi5jb3ZlcmFnZSkgKyBkYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJd3JpdGVyLmJlZ2ludGFnKCJrZXJuc3VidGFibGUiLCBjb3ZlcmFnZT1zZWxmLmNvdmVyYWdlLCBmb3JtYXQ9MCkKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQlpdGVtcyA9IHNlbGYua2VyblRhYmxlLml0ZW1zKCkKKwkJaXRlbXMuc29ydCgpCisJCWZvciAobGVmdCwgcmlnaHQpLCB2YWx1ZSBpbiBpdGVtczoKKwkJCXdyaXRlci5zaW1wbGV0YWcoInBhaXIiLCBbCisJCQkJCSgibCIsIGxlZnQpLAorCQkJCQkoInIiLCByaWdodCksCisJCQkJCSgidiIsIHZhbHVlKQorCQkJCQldKQorCQkJd3JpdGVyLm5ld2xpbmUoKQorCQl3cml0ZXIuZW5kdGFnKCJrZXJuc3VidGFibGUiKQorCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJc2VsZi5jb3ZlcmFnZSA9IHNhZmVFdmFsKGF0dHJzWyJjb3ZlcmFnZSJdKQorCQlzZWxmLnZlcnNpb24gPSBzYWZlRXZhbChhdHRyc1siZm9ybWF0Il0pCisJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJrZXJuVGFibGUiKToKKwkJCXNlbGYua2VyblRhYmxlID0ge30KKwkJZm9yIGVsZW1lbnQgaW4gY29udGVudDoKKwkJCWlmIHR5cGUoZWxlbWVudCkgPD4gdHlwZSgoKSk6CisJCQkJY29udGludWUKKwkJCW5hbWUsIGF0dHJzLCBjb250ZW50ID0gZWxlbWVudAorCQkJc2VsZi5rZXJuVGFibGVbKGF0dHJzWyJsIl0sIGF0dHJzWyJyIl0pXSA9IHNhZmVFdmFsKGF0dHJzWyJ2Il0pCisJCisJZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHBhaXIpOgorCQlyZXR1cm4gc2VsZi5rZXJuVGFibGVbcGFpcl0KKwkKKwlkZWYgX19zZXRpdGVtX18oc2VsZiwgcGFpciwgdmFsdWUpOgorCQlzZWxmLmtlcm5UYWJsZVtwYWlyXSA9IHZhbHVlCisJCisJZGVmIF9fZGVsaXRlbV9fKHNlbGYsIHBhaXIpOgorCQlkZWwgc2VsZi5rZXJuVGFibGVbcGFpcl0KKwkKKwlkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisJCXJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pCisKKworY2xhc3MgS2VyblRhYmxlX2Zvcm1hdF8yOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJc2VsZi5kYXRhID0gZGF0YQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCwgdHRGb250KToKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyKToKKwkJd3JpdGVyLmJlZ2ludGFnKCJrZXJuc3VidGFibGUiLCBmb3JtYXQ9MikKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQl3cml0ZXIuZHVtcGhleChzZWxmLmRhdGEpCisJCXdyaXRlci5lbmR0YWcoImtlcm5zdWJ0YWJsZSIpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZWxmLmRlY29tcGlsZShyZWFkSGV4KGNvbnRlbnQpKQorCisKK2NsYXNzIEtlcm5UYWJsZV9mb3JtYXRfdW5rb3duOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJc2VsZi5kYXRhID0gZGF0YQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXJldHVybiBkYXRhCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJd3JpdGVyLmJlZ2ludGFnKCJrZXJuc3VidGFibGUiLCBmb3JtYXQ9Ii0xIikKKwkJd3JpdGVyLm5ld2xpbmUoKQorCQl3cml0ZXIuY29tbWVudCgidW5rbm93biAna2Vybicgc3VidGFibGUgZm9ybWF0IikKKwkJd3JpdGVyLmR1bXBoZXgoc2VsZi5kYXRhKQorCQl3cml0ZXIuZW5kdGFnKCJrZXJuc3VidGFibGUiKQorCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJc2VsZi5kZWNvbXBpbGUocmVhZEhleChjb250ZW50KSkKKworCisKK2tlcm5fY2xhc3NlcyA9IHswOiBLZXJuVGFibGVfZm9ybWF0XzAsIDE6IEtlcm5UYWJsZV9mb3JtYXRfMn0KZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19sX29fY19hLnB5IGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX2xfb19jX2EucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyYTcwOAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19sX29fY19hLnB5CkBAIC0wLDAgKzEsNTUgQEAKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBhcnJheQoraW1wb3J0IE51bWVyaWMKK2Zyb20gZm9udFRvb2xzIGltcG9ydCB0dExpYgoraW1wb3J0IHN0cnVjdAorCitjbGFzcyB0YWJsZV9fbF9vX2NfYShEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKToKKwkKKwlkZXBlbmRlbmNpZXMgPSBbJ2dseWYnXQorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJbG9uZ0Zvcm1hdCA9IHR0Rm9udFsnaGVhZCddLmluZGV4VG9Mb2NGb3JtYXQKKwkJaWYgbG9uZ0Zvcm1hdDoKKwkJCWZvcm1hdCA9ICJsIgorCQllbHNlOgorCQkJZm9ybWF0ID0gIkgiCisJCWxvY2F0aW9ucyA9IGFycmF5LmFycmF5KGZvcm1hdCkKKwkJbG9jYXRpb25zLmZyb21zdHJpbmcoZGF0YSkKKwkJaWYgdHRMaWIuZW5kaWFuIDw+ICJiaWciOgorCQkJbG9jYXRpb25zLmJ5dGVzd2FwKCkKKwkJbG9jYXRpb25zID0gTnVtZXJpYy5hcnJheShsb2NhdGlvbnMsIE51bWVyaWMuSW50MzIpCisJCWlmIG5vdCBsb25nRm9ybWF0OgorCQkJbG9jYXRpb25zID0gbG9jYXRpb25zICogMgorCQlpZiBsZW4obG9jYXRpb25zKSA8PiAodHRGb250WydtYXhwJ10ubnVtR2x5cGhzICsgMSk6CisJCQlyYWlzZSAgdHRMaWIuVFRMaWJFcnJvciwgImNvcnJ1cHQgJ2xvY2EnIHRhYmxlIgorCQlzZWxmLmxvY2F0aW9ucyA9IGxvY2F0aW9ucworCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCWxvY2F0aW9ucyA9IHNlbGYubG9jYXRpb25zCisJCWlmIG1heChsb2NhdGlvbnMpIDwgMHgyMDAwMDoKKwkJCWxvY2F0aW9ucyA9IGxvY2F0aW9ucyAvIDIKKwkJCWxvY2F0aW9ucyA9IGxvY2F0aW9ucy5hc3R5cGUoTnVtZXJpYy5JbnQxNikKKwkJCXR0Rm9udFsnaGVhZCddLmluZGV4VG9Mb2NGb3JtYXQgPSAwCisJCWVsc2U6CisJCQl0dEZvbnRbJ2hlYWQnXS5pbmRleFRvTG9jRm9ybWF0ID0gMQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQlsb2NhdGlvbnMgPSBsb2NhdGlvbnMuYnl0ZXN3YXBwZWQoKQorCQlyZXR1cm4gbG9jYXRpb25zLnRvc3RyaW5nKCkKKwkKKwlkZWYgc2V0KHNlbGYsIGxvY2F0aW9ucyk6CisJCXNlbGYubG9jYXRpb25zID0gTnVtZXJpYy5hcnJheShsb2NhdGlvbnMsIE51bWVyaWMuSW50MzIpCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJd3JpdGVyLmNvbW1lbnQoIlRoZSAnbG9jYScgdGFibGUgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlciIpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorCQlyZXR1cm4gc2VsZi5sb2NhdGlvbnNbaW5kZXhdCisJCisJZGVmIF9fbGVuX18oc2VsZik6CisJCXJldHVybiBsZW4oc2VsZi5sb2NhdGlvbnMpCisJCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQlyZXR1cm4gY21wKGxlbihzZWxmKSwgbGVuKG90aGVyKSkgb3Igbm90IE51bWVyaWMuYWxsdHJ1ZShOdW1lcmljLmVxdWFsKHNlbGYubG9jYXRpb25zLCBvdGhlci5sb2NhdGlvbnMpKQorCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fbV9hX3hfcC5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19tX2FfeF9wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzVlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fbV9hX3hfcC5weQpAQCAtMCwwICsxLDEzOCBAQAoraW1wb3J0IERlZmF1bHRUYWJsZQoraW1wb3J0IHNzdHJ1Y3QKK2Zyb20gZm9udFRvb2xzLm1pc2MudGV4dFRvb2xzIGltcG9ydCBzYWZlRXZhbAorCittYXhwRm9ybWF0XzBfNSA9ICIiIgorCQk+CSMgYmlnIGVuZGlhbgorCQl0YWJsZVZlcnNpb246CQkJaQorCQludW1HbHlwaHM6CQkJCUgKKyIiIgorCittYXhwRm9ybWF0XzFfMF9hZGQgPSAiIiIKKwkJPgkjIGJpZyBlbmRpYW4KKwkJbWF4UG9pbnRzOgkJCQlICisJCW1heENvbnRvdXJzOgkJCUgKKwkJbWF4Q29tcG9zaXRlUG9pbnRzOgkJSAorCQltYXhDb21wb3NpdGVDb250b3VyczoJSAorCQltYXhab25lczoJCQkJSAorCQltYXhUd2lsaWdodFBvaW50czoJCUgKKwkJbWF4U3RvcmFnZToJCQkJSAorCQltYXhGdW5jdGlvbkRlZnM6CQlICisJCW1heEluc3RydWN0aW9uRGVmczoJCUgKKwkJbWF4U3RhY2tFbGVtZW50czoJCUgKKwkJbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zOglICisJCW1heENvbXBvbmVudEVsZW1lbnRzOglICisJCW1heENvbXBvbmVudERlcHRoOgkJSAorIiIiCisKKworY2xhc3MgdGFibGVfX21fYV94X3AoRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJZGVwZW5kZW5jaWVzID0gWydnbHlmJ10KKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIHR0Rm9udCk6CisJCWR1bW15LCBkYXRhID0gc3N0cnVjdC51bnBhY2syKG1heHBGb3JtYXRfMF81LCBkYXRhLCBzZWxmKQorCQlzZWxmLm51bUdseXBocyA9IGludChzZWxmLm51bUdseXBocykKKwkJaWYgc2VsZi50YWJsZVZlcnNpb24gPT0gMHgwMDAxMDAwMDoKKwkJCWR1bW15LCBkYXRhID0gc3N0cnVjdC51bnBhY2syKG1heHBGb3JtYXRfMV8wX2FkZCwgZGF0YSwgc2VsZikKKwkJZWxzZToKKwkJCWFzc2VydCBzZWxmLnRhYmxlVmVyc2lvbiA9PSAweDAwMDA1MDAwLCAidW5rbm93biAnbWF4cCcgZm9ybWF0OiAleCIgJSBzZWxmLnRhYmxlVmVyc2lvbgorCQlhc3NlcnQgbGVuKGRhdGEpID09IDAKKwkKKwlkZWYgY29tcGlsZShzZWxmLCB0dEZvbnQpOgorCQlpZiB0dEZvbnQuaGFzX2tleSgnZ2x5ZicpOgorCQkJaWYgdHRGb250LmlzTG9hZGVkKCdnbHlmJyk6CisJCQkJc2VsZi5yZWNhbGModHRGb250KQorCQllbHNlOgorCQkJcGFzcyAjIFhYWCBDRkYhISEKKwkJZGF0YSA9IHNzdHJ1Y3QucGFjayhtYXhwRm9ybWF0XzBfNSwgc2VsZikKKwkJaWYgc2VsZi50YWJsZVZlcnNpb24gPT0gMHgwMDAxMDAwMDoKKwkJCWRhdGEgPSBkYXRhICsgc3N0cnVjdC5wYWNrKG1heHBGb3JtYXRfMV8wX2FkZCwgc2VsZikKKwkJZWxzZToKKwkJCWFzc2VydCBzZWxmLnRhYmxlVmVyc2lvbiA9PSAweDAwMDA1MDAwLCAidW5rbm93biAnbWF4cCcgZm9ybWF0OiAlZiIgJSBzZWxmLnRhYmxlVmVyc2lvbgorCQlyZXR1cm4gZGF0YQorCQorCWRlZiByZWNhbGMoc2VsZiwgdHRGb250KToKKwkJIiIiUmVjYWxjdWxhdGUgdGhlIGZvbnQgYm91bmRpbmcgYm94LCBhbmQgbW9zdCBvdGhlciBtYXhwIHZhbHVlcyBleGNlcHQKKwkJZm9yIHRoZSBUVCBpbnN0cnVjdGlvbnMgdmFsdWVzLiBBbHNvIHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiBiaXQgMQorCQlvZiB0aGUgZmxhZ3MgZmllbGQgb2YgdGhlICdoZWFkJyB0YWJsZS4KKwkJIiIiCisJCWdseWZUYWJsZSA9IHR0Rm9udFsnZ2x5ZiddCisJCWhtdHhUYWJsZSA9IHR0Rm9udFsnaG10eCddCisJCWhlYWRUYWJsZSA9IHR0Rm9udFsnaGVhZCddCisJCXNlbGYubnVtR2x5cGhzID0gbGVuKGdseWZUYWJsZSkKKwkJeE1pbiA9IDEwMDAwMAorCQl5TWluID0gMTAwMDAwCisJCXhNYXggPSAtMTAwMDAwCisJCXlNYXggPSAtMTAwMDAwCisJCW1heFBvaW50cyA9IDAKKwkJbWF4Q29udG91cnMgPSAwCisJCW1heENvbXBvc2l0ZVBvaW50cyA9IDAKKwkJbWF4Q29tcG9zaXRlQ29udG91cnMgPSAwCisJCW1heENvbXBvbmVudEVsZW1lbnRzID0gMAorCQltYXhDb21wb25lbnREZXB0aCA9IDAKKwkJYWxsWE1heElzTHNiID0gMQorCQlmb3IgZ2x5cGhOYW1lIGluIHR0Rm9udC5nZXRHbHlwaE9yZGVyKCk6CisJCQlnID0gZ2x5ZlRhYmxlW2dseXBoTmFtZV0KKwkJCWlmIGcubnVtYmVyT2ZDb250b3VyczoKKwkJCQlpZiBobXR4VGFibGVbZ2x5cGhOYW1lXVsxXSA8PiBnLnhNaW46CisJCQkJCWFsbFhNYXhJc0xzYiA9IDAKKwkJCQl4TWluID0gbWluKHhNaW4sIGcueE1pbikKKwkJCQl5TWluID0gbWluKHlNaW4sIGcueU1pbikKKwkJCQl4TWF4ID0gbWF4KHhNYXgsIGcueE1heCkKKwkJCQl5TWF4ID0gbWF4KHlNYXgsIGcueU1heCkKKwkJCQlpZiBnLm51bWJlck9mQ29udG91cnMgPiAwOgorCQkJCQluUG9pbnRzLCBuQ29udG91cnMgPSBnLmdldE1heHBWYWx1ZXMoKQorCQkJCQltYXhQb2ludHMgPSBtYXgobWF4UG9pbnRzLCBuUG9pbnRzKQorCQkJCQltYXhDb250b3VycyA9IG1heChtYXhDb250b3VycywgbkNvbnRvdXJzKQorCQkJCWVsc2U6CisJCQkJCW5Qb2ludHMsIG5Db250b3VycywgY29tcG9uZW50RGVwdGggPSBnLmdldENvbXBvc2l0ZU1heHBWYWx1ZXMoZ2x5ZlRhYmxlKQorCQkJCQltYXhDb21wb3NpdGVQb2ludHMgPSBtYXgobWF4Q29tcG9zaXRlUG9pbnRzLCBuUG9pbnRzKQorCQkJCQltYXhDb21wb3NpdGVDb250b3VycyA9IG1heChtYXhDb21wb3NpdGVDb250b3VycywgbkNvbnRvdXJzKQorCQkJCQltYXhDb21wb25lbnRFbGVtZW50cyA9IG1heChtYXhDb21wb25lbnRFbGVtZW50cywgbGVuKGcuY29tcG9uZW50cykpCisJCQkJCW1heENvbXBvbmVudERlcHRoID0gbWF4KG1heENvbXBvbmVudERlcHRoLCBjb21wb25lbnREZXB0aCkKKwkJc2VsZi54TWluID0geE1pbgorCQlzZWxmLnlNaW4gPSB5TWluCisJCXNlbGYueE1heCA9IHhNYXgKKwkJc2VsZi55TWF4ID0geU1heAorCQlzZWxmLm1heFBvaW50cyA9IG1heFBvaW50cworCQlzZWxmLm1heENvbnRvdXJzID0gbWF4Q29udG91cnMKKwkJc2VsZi5tYXhDb21wb3NpdGVQb2ludHMgPSBtYXhDb21wb3NpdGVQb2ludHMKKwkJc2VsZi5tYXhDb21wb3NpdGVDb250b3VycyA9IG1heENvbXBvc2l0ZUNvbnRvdXJzCisJCXNlbGYubWF4Q29tcG9uZW50RGVwdGggPSBtYXhDb21wb25lbnREZXB0aAorCQlpZiBhbGxYTWF4SXNMc2I6CisJCQloZWFkVGFibGUuZmxhZ3MgPSBoZWFkVGFibGUuZmxhZ3MgfCAweDIKKwkJZWxzZToKKwkJCWhlYWRUYWJsZS5mbGFncyA9IGhlYWRUYWJsZS5mbGFncyAmIH4weDIKKwkKKwlkZWYgdGVzdHJlcHIoc2VsZik6CisJCWl0ZW1zID0gc2VsZi5fX2RpY3RfXy5pdGVtcygpCisJCWl0ZW1zLnNvcnQoKQorCQlwcmludCAiLiAuIC4gLiAuIC4gLiAuIC4iCisJCWZvciBjb21ibyBpbiBpdGVtczoKKwkJCXByaW50ICIgICVzOiAlcyIgJSBjb21ibworCQlwcmludCAiLiAuIC4gLiAuIC4gLiAuIC4iCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJaWYgc2VsZi50YWJsZVZlcnNpb24gPD4gMHgwMDAwNTAwMDoKKwkJCXdyaXRlci5jb21tZW50KCJNb3N0IG9mIHRoaXMgdGFibGUgd2lsbCBiZSByZWNhbGN1bGF0ZWQgYnkgdGhlIGNvbXBpbGVyIikKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJZm9ybWF0c3RyaW5nLCBuYW1lcywgZml4ZXMgPSBzc3RydWN0LmdldGZvcm1hdChtYXhwRm9ybWF0XzBfNSkKKwkJaWYgc2VsZi50YWJsZVZlcnNpb24gPT0gMHgwMDAxMDAwMDoKKwkJCWZvcm1hdHN0cmluZywgbmFtZXNfMV8wLCBmaXhlcyA9IHNzdHJ1Y3QuZ2V0Zm9ybWF0KG1heHBGb3JtYXRfMV8wX2FkZCkKKwkJCW5hbWVzID0gbmFtZXMgKyBuYW1lc18xXzAKKwkJZWxzZToKKwkJCWFzc2VydCBzZWxmLnRhYmxlVmVyc2lvbiA9PSAweDAwMDA1MDAwLCAidW5rbm93biAnbWF4cCcgZm9ybWF0OiAlZiIgJSBzZWxmLnRhYmxlVmVyc2lvbgorCQlmb3IgbmFtZSBpbiBuYW1lczoKKwkJCXZhbHVlID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorCQkJaWYgdHlwZSh2YWx1ZSkgPT0gdHlwZSgwTCk6CisJCQkJdmFsdWU9aW50KHZhbHVlKQorCQkJaWYgbmFtZSA9PSAidGFibGVWZXJzaW9uIjoKKwkJCQl2YWx1ZSA9IGhleCh2YWx1ZSkKKwkJCXdyaXRlci5zaW1wbGV0YWcobmFtZSwgdmFsdWU9dmFsdWUpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KToKKwkJc2V0YXR0cihzZWxmLCBuYW1lLCBzYWZlRXZhbChhdHRyc1sidmFsdWUiXSkpCisJCQorCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fbl9hX21fZS5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19uX2FfbV9lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2RlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fbl9hX21fZS5weQpAQCAtMCwwICsxLDEzNiBAQAoraW1wb3J0IERlZmF1bHRUYWJsZQoraW1wb3J0IHN0cnVjdCwgc3N0cnVjdAorZnJvbSBmb250VG9vbHMubWlzYy50ZXh0VG9vbHMgaW1wb3J0IHNhZmVFdmFsCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgdHlwZXMKKworbmFtZVJlY29yZEZvcm1hdCA9ICIiIgorCQk+CSMgYmlnIGVuZGlhbgorCQlwbGF0Zm9ybUlEOglICisJCXBsYXRFbmNJRDoJSAorCQlsYW5nSUQ6CQlICisJCW5hbWVJRDoJCUgKKwkJbGVuZ3RoOgkJSAorCQlvZmZzZXQ6CQlICisiIiIKKworY2xhc3MgdGFibGVfX25fYV9tX2UoRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlmb3JtYXQsIG4sIHN0cmluZ29mZnNldCA9IHN0cnVjdC51bnBhY2soIj5ISEgiLCBkYXRhWzo2XSkKKwkJc3RyaW5nb2Zmc2V0ID0gaW50KHN0cmluZ29mZnNldCkKKwkJc3RyaW5nRGF0YSA9IGRhdGFbc3RyaW5nb2Zmc2V0Ol0KKwkJZGF0YSA9IGRhdGFbNjpzdHJpbmdvZmZzZXRdCisJCXNlbGYubmFtZXMgPSBbXQorCQlmb3IgaSBpbiByYW5nZShuKToKKwkJCW5hbWUsIGRhdGEgPSBzc3RydWN0LnVucGFjazIobmFtZVJlY29yZEZvcm1hdCwgZGF0YSwgTmFtZVJlY29yZCgpKQorCQkJbmFtZS5maXhsb25ncygpCisJCQluYW1lLnN0cmluZyA9IHN0cmluZ0RhdGFbbmFtZS5vZmZzZXQ6bmFtZS5vZmZzZXQrbmFtZS5sZW5ndGhdCisJCQlkZWwgbmFtZS5vZmZzZXQsIG5hbWUubGVuZ3RoCisJCQlzZWxmLm5hbWVzLmFwcGVuZChuYW1lKQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXNlbGYubmFtZXMuc29ydCgpICAjIHNvcnQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjOyBzZWUgTmFtZVJlY29yZC5fX2NtcF9fKCkKKwkJc3RyaW5nRGF0YSA9ICIiCisJCWZvcm1hdCA9IDAKKwkJbiA9IGxlbihzZWxmLm5hbWVzKQorCQlzdHJpbmdvZmZzZXQgPSA2ICsgbiAqIHNzdHJ1Y3QuY2FsY3NpemUobmFtZVJlY29yZEZvcm1hdCkKKwkJZGF0YSA9IHN0cnVjdC5wYWNrKCI+SEhIIiwgZm9ybWF0LCBuLCBzdHJpbmdvZmZzZXQpCisJCWxhc3RvZmZzZXQgPSAwCisJCWRvbmUgPSB7fSAgIyByZW1lbWJlciB0aGUgZGF0YSBzbyB3ZSBjYW4gcmV1c2UgdGhlICJwb2ludGVycyIKKwkJZm9yIG5hbWUgaW4gc2VsZi5uYW1lczoKKwkJCWlmIGRvbmUuaGFzX2tleShuYW1lLnN0cmluZyk6CisJCQkJbmFtZS5vZmZzZXQsIG5hbWUubGVuZ3RoID0gZG9uZVtuYW1lLnN0cmluZ10KKwkJCWVsc2U6CisJCQkJbmFtZS5vZmZzZXQsIG5hbWUubGVuZ3RoID0gZG9uZVtuYW1lLnN0cmluZ10gPSBsZW4oc3RyaW5nRGF0YSksIGxlbihuYW1lLnN0cmluZykKKwkJCQlzdHJpbmdEYXRhID0gc3RyaW5nRGF0YSArIG5hbWUuc3RyaW5nCisJCQlkYXRhID0gZGF0YSArIHNzdHJ1Y3QucGFjayhuYW1lUmVjb3JkRm9ybWF0LCBuYW1lKQorCQlyZXR1cm4gZGF0YSArIHN0cmluZ0RhdGEKKwkKKwlkZWYgdG9YTUwoc2VsZiwgd3JpdGVyLCB0dEZvbnQpOgorCQlmb3IgbmFtZSBpbiBzZWxmLm5hbWVzOgorCQkJbmFtZS50b1hNTCh3cml0ZXIsIHR0Rm9udCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlpZiBuYW1lIDw+ICJuYW1lcmVjb3JkIjoKKwkJCXJldHVybiAjIGlnbm9yZSB1bmtub3duIHRhZ3MKKwkJaWYgbm90IGhhc2F0dHIoc2VsZiwgIm5hbWVzIik6CisJCQlzZWxmLm5hbWVzID0gW10KKwkJbmFtZSA9IE5hbWVSZWNvcmQoKQorCQlzZWxmLm5hbWVzLmFwcGVuZChuYW1lKQorCQluYW1lLmZyb21YTUwoKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgdHRGb250KQorCQorCWRlZiBnZXRuYW1lKHNlbGYsIG5hbWVJRCwgcGxhdGZvcm1JRCwgcGxhdEVuY0lELCBsYW5nSUQ9Tm9uZSk6CisJCWZvciBuYW1lcmVjb3JkIGluIHNlbGYubmFtZXM6CisJCQlpZiAoCW5hbWVyZWNvcmQubmFtZUlEID09IG5hbWVJRCBhbmQgCisJCQkJCW5hbWVyZWNvcmQucGxhdGZvcm1JRCA9PSBwbGF0Zm9ybUlEIGFuZCAKKwkJCQkJbmFtZXJlY29yZC5wbGF0RW5jSUQgPT0gcGxhdEVuY0lEKToKKwkJCQlpZiBsYW5nSUQgaXMgTm9uZSBvciBuYW1lcmVjb3JkLmxhbmdJRCA9PSBsYW5nSUQ6CisJCQkJCXJldHVybiBuYW1lcmVjb3JkCisJCXJldHVybiBOb25lICMgbm90IGZvdW5kCisJCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQlyZXR1cm4gY21wKHNlbGYubmFtZXMsIG90aGVyLm5hbWVzKQorCQorCitjbGFzcyBOYW1lUmVjb3JkOgorCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCXdyaXRlci5iZWdpbnRhZygibmFtZXJlY29yZCIsIFsKKwkJCQkoIm5hbWVJRCIsIHNlbGYubmFtZUlEKSwKKwkJCQkoInBsYXRmb3JtSUQiLCBzZWxmLnBsYXRmb3JtSUQpLAorCQkJCSgicGxhdEVuY0lEIiwgc2VsZi5wbGF0RW5jSUQpLAorCQkJCSgibGFuZ0lEIiwgaGV4KHNlbGYubGFuZ0lEKSksCisJCQkJCQldKQorCQl3cml0ZXIubmV3bGluZSgpCisJCWlmIHNlbGYucGxhdGZvcm1JRCA9PSAwIG9yIChzZWxmLnBsYXRmb3JtSUQgPT0gMyBhbmQgc2VsZi5wbGF0RW5jSUQgPT0gMSk6CisJCQl3cml0ZXIud3JpdGUxNmJpdChzZWxmLnN0cmluZykKKwkJZWxzZToKKwkJCXdyaXRlci53cml0ZThiaXQoc2VsZi5zdHJpbmcpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkJd3JpdGVyLmVuZHRhZygibmFtZXJlY29yZCIpCisJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZWxmLm5hbWVJRCA9IHNhZmVFdmFsKGF0dHJzWyJuYW1lSUQiXSkKKwkJc2VsZi5wbGF0Zm9ybUlEID0gc2FmZUV2YWwoYXR0cnNbInBsYXRmb3JtSUQiXSkKKwkJc2VsZi5wbGF0RW5jSUQgPSBzYWZlRXZhbChhdHRyc1sicGxhdEVuY0lEIl0pCisJCXNlbGYubGFuZ0lEID0gIHNhZmVFdmFsKGF0dHJzWyJsYW5nSUQiXSkKKwkJaWYgc2VsZi5wbGF0Zm9ybUlEID09IDAgb3IgKHNlbGYucGxhdGZvcm1JRCA9PSAzIGFuZCBzZWxmLnBsYXRFbmNJRCA9PSAxKToKKwkJCWZyb20gZm9udFRvb2xzLnR0TGliLnhtbEltcG9ydCBpbXBvcnQgVW5pY29kZVN0cmluZworCQkJc3RyID0gVW5pY29kZVN0cmluZygiIikKKwkJCWZvciBlbGVtZW50IGluIGNvbnRlbnQ6CisJCQkJc3RyID0gc3RyICsgZWxlbWVudAorCQkJc2VsZi5zdHJpbmcgPSBzdHIuc3RyaXBwZWQoKS50b3N0cmluZygpCisJCWVsc2U6CisJCQlzZWxmLnN0cmluZyA9IHN0cmluZy5zdHJpcChzdHJpbmcuam9pbihjb250ZW50LCAiIikpCisJCisJZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCQkiIiJDb21wYXJlIG1ldGhvZCwgc28gYSBsaXN0IG9mIE5hbWVSZWNvcmRzIGNhbiBiZSBzb3J0ZWQKKwkJYWNjb3JkaW5nIHRvIHRoZSBzcGVjIGJ5IGp1c3Qgc29ydGluZyBpdC4uLiIiIgorCQlzZWxmdHVwbGUgPSAoc2VsZi5wbGF0Zm9ybUlELAorCQkJCXNlbGYucGxhdEVuY0lELAorCQkJCXNlbGYubGFuZ0lELAorCQkJCXNlbGYubmFtZUlELAorCQkJCXNlbGYuc3RyaW5nKQorCQlvdGhlcnR1cGxlID0gKG90aGVyLnBsYXRmb3JtSUQsCisJCQkJb3RoZXIucGxhdEVuY0lELAorCQkJCW90aGVyLmxhbmdJRCwKKwkJCQlvdGhlci5uYW1lSUQsCisJCQkJb3RoZXIuc3RyaW5nKQorCQlyZXR1cm4gY21wKHNlbGZ0dXBsZSwgb3RoZXJ0dXBsZSkKKwkKKwlkZWYgX19yZXByX18oc2VsZik6CisJCXJldHVybiAiPE5hbWVSZWNvcmQgTmFtZUlEPSVkOyBQbGF0Zm9ybUlEPSVkOyBMYW5ndWFnZUlEPSVkPiIgJSAoCisJCQkJc2VsZi5uYW1lSUQsIHNlbGYucGxhdGZvcm1JRCwgc2VsZi5sYW5nSUQpCisJCisJZGVmIGZpeGxvbmdzKHNlbGYpOgorCQkiIiJjb3JyZWN0IGVmZmVjdHMgZnJvbSBidWcgaW4gUHl0aG9uIDEuNS4xLCB3aGVyZSAiSCIgCisJCXJldHVybnMgYSBQeXRob24gTG9uZyBpbnQuIAorCQlUaGlzIGhhcyBiZWVuIGZpeGVkIGluIFB5dGhvbiAxLjUuMi4KKwkJIiIiCisJCWZvciBhdHRyIGluIGRpcihzZWxmKToKKwkJCXZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKKwkJCWlmIHR5cGUodmFsKSA9PSB0eXBlcy5Mb25nVHlwZToKKwkJCQlzZXRhdHRyKHNlbGYsIGF0dHIsIGludCh2YWwpKQorCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fcF9vX3NfdC5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL19wX29fc190LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2RlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fcF9vX3NfdC5weQpAQCAtMCwwICsxLDIxNCBAQAorZnJvbSBmb250VG9vbHMudHRMaWIuc3RhbmRhcmRHbHlwaE9yZGVyIGltcG9ydCBzdGFuZGFyZEdseXBoT3JkZXIKK2ltcG9ydCBEZWZhdWx0VGFibGUKK2ltcG9ydCBzdHJ1Y3QsIHNzdHJ1Y3QKK2ltcG9ydCBhcnJheQorZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCitmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwsIHJlYWRIZXgKKworCitwb3N0Rm9ybWF0ID0gIiIiCisJPgorCWZvcm1hdFR5cGU6CQkJMTYuMTZGCisJaXRhbGljQW5nbGU6CQkxNi4xNkYJCSMgaXRhbGljIGFuZ2xlIGluIGRlZ3JlZXMJCQkKKwl1bmRlcmxpbmVQb3NpdGlvbjoJaAorCXVuZGVybGluZVRoaWNrbmVzczoJaAorCWlzRml4ZWRQaXRjaDoJCWwKKwltaW5NZW1UeXBlNDI6CQlsCQkJIyBtaW5pbXVtIG1lbW9yeSBpZiBUcnVlVHlwZSBmb250IGlzIGRvd25sb2FkZWQKKwltYXhNZW1UeXBlNDI6CQlsCQkJIyBtYXhpbXVtIG1lbW9yeSBpZiBUcnVlVHlwZSBmb250IGlzIGRvd25sb2FkZWQKKwltaW5NZW1UeXBlMToJCWwJCQkjIG1pbmltdW0gbWVtb3J5IGlmIFR5cGUxIGZvbnQgaXMgZG93bmxvYWRlZAorCW1heE1lbVR5cGUxOgkJbAkJCSMgbWF4aW11bSBtZW1vcnkgaWYgVHlwZTEgZm9udCBpcyBkb3dubG9hZGVkCisiIiIKKworcG9zdEZvcm1hdFNpemUgPSBzc3RydWN0LmNhbGNzaXplKHBvc3RGb3JtYXQpCisKKworY2xhc3MgdGFibGVfX3Bfb19zX3QoRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJZGVmIGRlY29tcGlsZShzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlzc3RydWN0LnVucGFjayhwb3N0Rm9ybWF0LCBkYXRhWzpwb3N0Rm9ybWF0U2l6ZV0sIHNlbGYpCisJCWRhdGEgPSBkYXRhW3Bvc3RGb3JtYXRTaXplOl0KKwkJaWYgc2VsZi5mb3JtYXRUeXBlID09IDEuMDoKKwkJCXNlbGYuZGVjb2RlX2Zvcm1hdF8xXzAoZGF0YSwgdHRGb250KQorCQllbGlmIHNlbGYuZm9ybWF0VHlwZSA9PSAyLjA6CisJCQlzZWxmLmRlY29kZV9mb3JtYXRfMl8wKGRhdGEsIHR0Rm9udCkKKwkJZWxpZiBzZWxmLmZvcm1hdFR5cGUgPT0gMy4wOgorCQkJc2VsZi5kZWNvZGVfZm9ybWF0XzNfMChkYXRhLCB0dEZvbnQpCisJCWVsc2U6CisJCQkjIHN1cHBvcnRlZCBmb3JtYXQKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICIncG9zdCcgdGFibGUgZm9ybWF0ICVmIG5vdCBzdXBwb3J0ZWQiICUgc2VsZi5mb3JtYXRUeXBlCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgdHRGb250KToKKwkJZGF0YSA9IHNzdHJ1Y3QucGFjayhwb3N0Rm9ybWF0LCBzZWxmKQorCQlpZiBzZWxmLmZvcm1hdFR5cGUgPT0gMS4wOgorCQkJcGFzcyAjIHdlJ3JlIGRvbmUKKwkJZWxpZiBzZWxmLmZvcm1hdFR5cGUgPT0gMi4wOgorCQkJZGF0YSA9IGRhdGEgKyBzZWxmLmVuY29kZV9mb3JtYXRfMl8wKHR0Rm9udCkKKwkJZWxpZiBzZWxmLmZvcm1hdFR5cGUgPT0gMy4wOgorCQkJcGFzcyAjIHdlJ3JlIGRvbmUKKwkJZWxzZToKKwkJCSMgc3VwcG9ydGVkIGZvcm1hdAorCQkJcmFpc2UgdHRMaWIuVFRMaWJFcnJvciwgIidwb3N0JyB0YWJsZSBmb3JtYXQgJWYgbm90IHN1cHBvcnRlZCIgJSBzZWxmLmZvcm1hdFR5cGUKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgZ2V0R2x5cGhPcmRlcihzZWxmKToKKwkJIiIiVGhpcyBmdW5jdGlvbiB3aWxsIGdldCBjYWxsZWQgYnkgYSB0dExpYi5UVEZvbnQgaW5zdGFuY2UuCisJCURvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24geW91cnNlbGYsIHVzZSBUVEZvbnQoKS5nZXRHbHlwaE9yZGVyKCkKKwkJb3IgaXRzIHJlbGF0aXZlcyBpbnN0ZWFkIQorCQkiIiIKKwkJaWYgbm90IGhhc2F0dHIoc2VsZiwgImdseXBoT3JkZXIiKToKKwkJCXJhaXNlIHR0TGliLlRUTGliRXJyb3IsICJpbGxlZ2FsIHVzZSBvZiBnZXRHbHlwaE9yZGVyKCkiCisJCWdseXBoT3JkZXIgPSBzZWxmLmdseXBoT3JkZXIKKwkJZGVsIHNlbGYuZ2x5cGhPcmRlcgorCQlyZXR1cm4gZ2x5cGhPcmRlcgorCQorCWRlZiBkZWNvZGVfZm9ybWF0XzFfMChzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQlzZWxmLmdseXBoT3JkZXIgPSBzdGFuZGFyZEdseXBoT3JkZXJbOl0KKwkKKwlkZWYgZGVjb2RlX2Zvcm1hdF8yXzAoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJbnVtR2x5cGhzLCA9IHN0cnVjdC51bnBhY2soIj5IIiwgZGF0YVs6Ml0pCisJCW51bUdseXBocyA9IGludChudW1HbHlwaHMpCisJCWRhdGEgPSBkYXRhWzI6XQorCQlpbmRpY2VzID0gYXJyYXkuYXJyYXkoIkgiKQorCQlpbmRpY2VzLmZyb21zdHJpbmcoZGF0YVs6MipudW1HbHlwaHNdKQorCQlpZiB0dExpYi5lbmRpYW4gPD4gImJpZyI6CisJCQlpbmRpY2VzLmJ5dGVzd2FwKCkKKwkJZGF0YSA9IGRhdGFbMipudW1HbHlwaHM6XQorCQlzZWxmLmV4dHJhTmFtZXMgPSBleHRyYU5hbWVzID0gdW5wYWNrUFN0cmluZ3MoZGF0YSkKKwkJc2VsZi5nbHlwaE9yZGVyID0gZ2x5cGhPcmRlciA9IFtOb25lXSAqIGludCh0dEZvbnRbJ21heHAnXS5udW1HbHlwaHMpCisJCWZvciBnbHlwaElEIGluIHJhbmdlKG51bUdseXBocyk6CisJCQlpbmRleCA9IGluZGljZXNbZ2x5cGhJRF0KKwkJCWlmIGluZGV4ID4gMjU3OgorCQkJCW5hbWUgPSBleHRyYU5hbWVzW2luZGV4LTI1OF0KKwkJCWVsc2U6CisJCQkJIyBmZXRjaCBuYW1lcyBmcm9tIHN0YW5kYXJkIGxpc3QKKwkJCQluYW1lID0gc3RhbmRhcmRHbHlwaE9yZGVyW2luZGV4XQorCQkJZ2x5cGhPcmRlcltnbHlwaElEXSA9IG5hbWUKKwkJI0FMOTkwNTExOiBjb2RlIGFkZGVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBuZXcgZ2x5cGhzIHdpdGhvdXQKKwkJIyAgICAgICAgICBlbnRyaWVzIGludG8gdGhlICdwb3N0JyB0YWJsZQorCQlpZiBudW1HbHlwaHMgPCB0dEZvbnRbJ21heHAnXS5udW1HbHlwaHM6CisJCQlmb3IgaSBpbiByYW5nZShudW1HbHlwaHMsIHR0Rm9udFsnbWF4cCddLm51bUdseXBocyk6CisJCQkJZ2x5cGhPcmRlcltpXSA9ICJnbHlwaCMlLjVkIiAlIGkKKwkJCQlzZWxmLmV4dHJhTmFtZXMuYXBwZW5kKGdseXBoT3JkZXJbaV0pCisJCXNlbGYuYnVpbGRfcHNOYW1lTWFwcGluZyh0dEZvbnQpCisJCisJZGVmIGJ1aWxkX3BzTmFtZU1hcHBpbmcoc2VsZiwgdHRGb250KToKKwkJbWFwcGluZyA9IHt9CisJCWFsbE5hbWVzID0ge30KKwkJZm9yIGkgaW4gcmFuZ2UodHRGb250WydtYXhwJ10ubnVtR2x5cGhzKToKKwkJCWdseXBoTmFtZSA9IHBzTmFtZSA9IHNlbGYuZ2x5cGhPcmRlcltpXQorCQkJaWYgYWxsTmFtZXMuaGFzX2tleShnbHlwaE5hbWUpOgorCQkJCSMgbWFrZSB1cCBhIG5ldyBnbHlwaE5hbWUgdGhhdCdzIHVuaXF1ZQorCQkJCW4gPSAxCisJCQkJd2hpbGUgYWxsTmFtZXMuaGFzX2tleShnbHlwaE5hbWUgKyAiIyIgKyBgbmApOgorCQkJCQluID0gbiArIDEKKwkJCQlnbHlwaE5hbWUgPSBnbHlwaE5hbWUgKyAiIyIgKyBgbmAKKwkJCQlzZWxmLmdseXBoT3JkZXJbaV0gPSBnbHlwaE5hbWUKKwkJCQltYXBwaW5nW2dseXBoTmFtZV0gPSBwc05hbWUKKwkJCWFsbE5hbWVzW2dseXBoTmFtZV0gPSBwc05hbWUKKwkJc2VsZi5tYXBwaW5nID0gbWFwcGluZworCQorCWRlZiBkZWNvZGVfZm9ybWF0XzNfMChzZWxmLCBkYXRhLCB0dEZvbnQpOgorCQkjIFNldHRpbmcgc2VsZi5nbHlwaE9yZGVyIHRvIE5vbmUgd2lsbCBjYXVzZSB0aGUgVFRGb250IG9iamVjdAorCQkjIHRyeSBhbmQgY29uc3RydWN0IGdseXBoIG5hbWVzIGZyb20gYSBVbmljb2RlIGNtYXAgdGFibGUuCisJCXNlbGYuZ2x5cGhPcmRlciA9IE5vbmUKKwkKKwlkZWYgZW5jb2RlX2Zvcm1hdF8yXzAoc2VsZiwgdHRGb250KToKKwkJbnVtR2x5cGhzID0gdHRGb250WydtYXhwJ10ubnVtR2x5cGhzCisJCWdseXBoT3JkZXIgPSB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpCisJCWFzc2VydCBsZW4oZ2x5cGhPcmRlcikgPT0gbnVtR2x5cGhzCisJCWluZGljZXMgPSBhcnJheS5hcnJheSgiSCIpCisJCWZvciBnbHlwaElEIGluIHJhbmdlKG51bUdseXBocyk6CisJCQlnbHlwaE5hbWUgPSBnbHlwaE9yZGVyW2dseXBoSURdCisJCQlpZiBzZWxmLm1hcHBpbmcuaGFzX2tleShnbHlwaE5hbWUpOgorCQkJCXBzTmFtZSA9IHNlbGYubWFwcGluZ1tnbHlwaE5hbWVdCisJCQllbHNlOgorCQkJCXBzTmFtZSA9IGdseXBoTmFtZQorCQkJaWYgcHNOYW1lIGluIHNlbGYuZXh0cmFOYW1lczoKKwkJCQlpbmRleCA9IDI1OCArIHNlbGYuZXh0cmFOYW1lcy5pbmRleChwc05hbWUpCisJCQllbGlmIHBzTmFtZSBpbiBzdGFuZGFyZEdseXBoT3JkZXI6CisJCQkJaW5kZXggPSBzdGFuZGFyZEdseXBoT3JkZXIuaW5kZXgocHNOYW1lKQorCQkJZWxzZToKKwkJCQlpbmRleCA9IDI1OCArIGxlbihzZWxmLmV4dHJhTmFtZXMpCisJCQkJZXh0cmFOYW1lcy5hcHBlbmQocHNOYW1lKQorCQkJaW5kaWNlcy5hcHBlbmQoaW5kZXgpCisJCWlmIHR0TGliLmVuZGlhbiA8PiAiYmlnIjoKKwkJCWluZGljZXMuYnl0ZXN3YXAoKQorCQlyZXR1cm4gc3RydWN0LnBhY2soIj5IIiwgbnVtR2x5cGhzKSArIGluZGljZXMudG9zdHJpbmcoKSArIHBhY2tQU3RyaW5ncyhzZWxmLmV4dHJhTmFtZXMpCisJCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJZm9ybWF0c3RyaW5nLCBuYW1lcywgZml4ZXMgPSBzc3RydWN0LmdldGZvcm1hdChwb3N0Rm9ybWF0KQorCQlmb3IgbmFtZSBpbiBuYW1lczoKKwkJCXZhbHVlID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorCQkJd3JpdGVyLnNpbXBsZXRhZyhuYW1lLCB2YWx1ZT12YWx1ZSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJaWYgaGFzYXR0cihzZWxmLCAibWFwcGluZyIpOgorCQkJd3JpdGVyLmJlZ2ludGFnKCJwc05hbWVzIikKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCXdyaXRlci5jb21tZW50KCJUaGlzIGZpbGUgdXNlcyB1bmlxdWUgZ2x5cGggbmFtZXMgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uXG4iCisJCQkJCQkiZm91bmQgaW4gdGhlICdwb3N0JyB0YWJsZS4gU2luY2UgdGhlc2UgbmFtZXMgbWlnaHQgbm90IGJlIHVuaXF1ZSxcbiIKKwkJCQkJCSJ3ZSBoYXZlIHRvIGludmVudCBhcnRpZmljaWFsIG5hbWVzIGluIGNhc2Ugb2YgY2xhc2hlcy4gSW4gb3JkZXIgdG9cbiIKKwkJCQkJCSJiZSBhYmxlIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgaW5mb3JtYXRpb24sIHdlIG5lZWQgYSBuYW1lIHRvXG4iCisJCQkJCQkicHMgbmFtZSBtYXBwaW5nIGZvciB0aG9zZSBjYXNlcyB3aGVyZSB0aGV5IGRpZmZlci4gVGhhdCdzIHdoYXRcbiIKKwkJCQkJCSJ5b3Ugc2VlIGJlbG93LlxuIikKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCWl0ZW1zID0gc2VsZi5tYXBwaW5nLml0ZW1zKCkKKwkJCWl0ZW1zLnNvcnQoKQorCQkJZm9yIG5hbWUsIHBzTmFtZSBpbiBpdGVtczoKKwkJCQl3cml0ZXIuc2ltcGxldGFnKCJwc05hbWUiLCBuYW1lPW5hbWUsIHBzTmFtZT1wc05hbWUpCisJCQkJd3JpdGVyLm5ld2xpbmUoKQorCQkJd3JpdGVyLmVuZHRhZygicHNOYW1lcyIpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCWlmIGhhc2F0dHIoc2VsZiwgImV4dHJhTmFtZXMiKToKKwkJCXdyaXRlci5iZWdpbnRhZygiZXh0cmFOYW1lcyIpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQl3cml0ZXIuY29tbWVudCgiZm9sbG93aW5nIGFyZSB0aGUgbmFtZSB0aGF0IGFyZSBub3QgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgTWFjIGdseXBoIG9yZGVyIikKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkJCWZvciBuYW1lIGluIHNlbGYuZXh0cmFOYW1lczoKKwkJCQl3cml0ZXIuc2ltcGxldGFnKCJwc05hbWUiLCBuYW1lPW5hbWUpCisJCQkJd3JpdGVyLm5ld2xpbmUoKQorCQkJd3JpdGVyLmVuZHRhZygiZXh0cmFOYW1lcyIpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCWlmIGhhc2F0dHIoc2VsZiwgImRhdGEiKToKKwkJCXdyaXRlci5iZWdpbnRhZygiaGV4ZGF0YSIpCisJCQl3cml0ZXIubmV3bGluZSgpCisJCQl3cml0ZXIuZHVtcGhleChzZWxmLmRhdGEpCisJCQl3cml0ZXIuZW5kdGFnKCJoZXhkYXRhIikKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlpZiBuYW1lIG5vdCBpbiAoInBzTmFtZXMiLCAiZXh0cmFOYW1lcyIsICJoZXhkYXRhIik6CisJCQlzZXRhdHRyKHNlbGYsIG5hbWUsIHNhZmVFdmFsKGF0dHJzWyJ2YWx1ZSJdKSkKKwkJZWxpZiBuYW1lID09ICJwc05hbWVzIjoKKwkJCXNlbGYubWFwcGluZyA9IHt9CisJCQlmb3IgZWxlbWVudCBpbiBjb250ZW50OgorCQkJCWlmIHR5cGUoZWxlbWVudCkgPD4gdHlwZSgoKSk6CisJCQkJCWNvbnRpbnVlCisJCQkJbmFtZSwgYXR0cnMsIGNvbnRlbnQgPSBlbGVtZW50CisJCQkJaWYgbmFtZSA9PSAicHNOYW1lIjoKKwkJCQkJc2VsZi5tYXBwaW5nW2F0dHJzWyJuYW1lIl1dID0gYXR0cnNbInBzTmFtZSJdCisJCWVsaWYgbmFtZSA9PSAiZXh0cmFOYW1lcyI6CisJCQlzZWxmLmV4dHJhTmFtZXMgPSBbXQorCQkJZm9yIGVsZW1lbnQgaW4gY29udGVudDoKKwkJCQlpZiB0eXBlKGVsZW1lbnQpIDw+IHR5cGUoKCkpOgorCQkJCQljb250aW51ZQorCQkJCW5hbWUsIGF0dHJzLCBjb250ZW50ID0gZWxlbWVudAorCQkJCWlmIG5hbWUgPT0gInBzTmFtZSI6CisJCQkJCXNlbGYuZXh0cmFOYW1lcy5hcHBlbmQoYXR0cnNbIm5hbWUiXSkKKwkJZWxzZToKKwkJCXNlbGYuZGF0YSA9IHJlYWRIZXgoY29udGVudCkKKworCitkZWYgdW5wYWNrUFN0cmluZ3MoZGF0YSk6CisJc3RyaW5ncyA9IFtdCisJd2hpbGUgZGF0YToKKwkJbGVuZ3RoID0gb3JkKGRhdGFbMF0pCisJCXN0cmluZ3MuYXBwZW5kKGRhdGFbMToxK2xlbmd0aF0pCisJCWRhdGEgPSBkYXRhWzErbGVuZ3RoOl0KKwlyZXR1cm4gc3RyaW5ncworCitkZWYgcGFja1BTdHJpbmdzKHN0cmluZ3MpOgorCWRhdGEgPSAiIgorCWZvciBzIGluIHN0cmluZ3M6CisJCWRhdGEgPSBkYXRhICsgY2hyKGxlbihzKSkgKyBzCisJcmV0dXJuIGRhdGEKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX3Bfcl9lX3AucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fcF9yX2VfcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDVjOGVlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX3Bfcl9lX3AucHkKQEAgLTAsMCArMSwxNCBAQAoraW1wb3J0IERlZmF1bHRUYWJsZQoraW1wb3J0IGFycmF5CisKK2NsYXNzIHRhYmxlX19wX3JfZV9wKERlZmF1bHRUYWJsZS5EZWZhdWx0VGFibGUpOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJc2VsZi5wcmVwID0gZGF0YQorCQorCWRlZiBjb21waWxlKHNlbGYsIHR0Rm9udCk6CisJCXJldHVybiBzZWxmLnByZXAKKwkKKwlkZWYgX19sZW5fXyhzZWxmKToKKwkJcmV0dXJuIGxlbihzZWxmLnByZXApCisJCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fdl9oX2VfYS5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL192X2hfZV9hLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZmQ2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fdl9oX2VfYS5weQpAQCAtMCwwICsxLDc4IEBACitpbXBvcnQgRGVmYXVsdFRhYmxlCitpbXBvcnQgc3N0cnVjdAorZnJvbSBmb250VG9vbHMubWlzYy50ZXh0VG9vbHMgaW1wb3J0IHNhZmVFdmFsCisKK3ZoZWFGb3JtYXQgPSAiIiIKKwkJPgkjIGJpZyBlbmRpYW4KKwkJdGFibGVWZXJzaW9uOgkJCTE2LjE2RgorCQlhc2NlbnQ6CQkJCQloCisJCWRlc2NlbnQ6CQkJCWgKKwkJbGluZUdhcDoJCQkJaAorCQlhZHZhbmNlSGVpZ2h0TWF4OgkJSAorCQltaW5Ub3BTaWRlQmVhcmluZzoJCWgKKwkJbWluQm90dG9tU2lkZUJlYXJpbmc6CWgKKwkJeU1heEV4dGVudDoJCQkJaAorCQljYXJldFNsb3BlUmlzZToJCQloCisJCWNhcmV0U2xvcGVSdW46CQkJaAorCQlyZXNlcnZlZDA6CQkJCWgKKwkJcmVzZXJ2ZWQxOgkJCQloCisJCXJlc2VydmVkMjoJCQkJaAorCQlyZXNlcnZlZDM6CQkJCWgKKwkJcmVzZXJ2ZWQ0OgkJCQloCisJCW1ldHJpY0RhdGFGb3JtYXQ6CQloCisJCW51bWJlck9mVk1ldHJpY3M6CQlICisiIiIKKworY2xhc3MgdGFibGVfX3ZfaF9lX2EoRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJZGVwZW5kZW5jaWVzID0gWyd2bXR4JywgJ2dseWYnXQorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJc3N0cnVjdC51bnBhY2sodmhlYUZvcm1hdCwgZGF0YSwgc2VsZikKKwkKKwlkZWYgY29tcGlsZShzZWxmLCB0dEZvbnQpOgorCQlzZWxmLnJlY2FsYyh0dEZvbnQpCisJCXJldHVybiBzc3RydWN0LnBhY2sodmhlYUZvcm1hdCwgc2VsZikKKwkKKwlkZWYgcmVjYWxjKHNlbGYsIHR0Rm9udCk6CisJCXZ0bXhUYWJsZSA9IHR0Rm9udFsndm10eCddCisJCWlmIHR0Rm9udC5oYXNfa2V5KCdnbHlmJyk6CisJCQlpZiBub3QgdHRGb250LmlzTG9hZGVkKCdnbHlmJyk6CisJCQkJcmV0dXJuCisJCQlnbHlmVGFibGUgPSB0dEZvbnRbJ2dseWYnXQorCQkJYWR2YW5jZUhlaWdodE1heCA9IC0xMDAwMDAgICAgIyBhcmJpdHJhcnkgYmlnIG5lZ2F0aXZlIG51bWJlcgorCQkJbWluVG9wU2lkZUJlYXJpbmcgPSAxMDAwMDAgICAgIyBhcmJpdHJhcnkgYmlnIG51bWJlcgorCQkJbWluQm90dG9tU2lkZUJlYXJpbmcgPSAxMDAwMDAgIyBhcmJpdHJhcnkgYmlnIG51bWJlcgorCQkJeU1heEV4dGVudCA9IC0xMDAwMDAgICAgICAgICAgIyBhcmJpdHJhcnkgYmlnIG5lZ2F0aXZlIG51bWJlcgorCQkJCisJCQlmb3IgbmFtZSBpbiB0dEZvbnQuZ2V0R2x5cGhPcmRlcigpOgorCQkJCWhlaWdodCwgdHNiID0gdnRteFRhYmxlW25hbWVdCisJCQkJZyA9IGdseWZUYWJsZVtuYW1lXQorCQkJCWlmIGcubnVtYmVyT2ZDb250b3VycyA8PSAwOgorCQkJCQljb250aW51ZQorCQkJCWFkdmFuY2VIZWlnaHRNYXggPSBtYXgoYWR2YW5jZUhlaWdodE1heCwgaGVpZ2h0KQorCQkJCW1pblRvcFNpZGVCZWFyaW5nID0gbWluKG1pblRvcFNpZGVCZWFyaW5nLCB0c2IpCisJCQkJcnNiID0gaGVpZ2h0IC0gdHNiIC0gKGcueU1heCAtIGcueU1pbikKKwkJCQltaW5Cb3R0b21TaWRlQmVhcmluZyA9IG1pbihtaW5Cb3R0b21TaWRlQmVhcmluZywgcnNiKQorCQkJCWV4dGVudCA9IHRzYiArIChnLnlNYXggLSBnLnlNaW4pCisJCQkJeU1heEV4dGVudCA9IG1heCh5TWF4RXh0ZW50LCBleHRlbnQpCisJCQlzZWxmLmFkdmFuY2VIZWlnaHRNYXggPSBhZHZhbmNlSGVpZ2h0TWF4CisJCQlzZWxmLm1pblRvcFNpZGVCZWFyaW5nID0gbWluVG9wU2lkZUJlYXJpbmcKKwkJCXNlbGYubWluQm90dG9tU2lkZUJlYXJpbmcgPSBtaW5Cb3R0b21TaWRlQmVhcmluZworCQkJc2VsZi55TWF4RXh0ZW50ID0geU1heEV4dGVudAorCQllbHNlOgorCQkJIyBYWFggQ0ZGIHJlY2FsYy4uLgorCQkJcGFzcworCQorCWRlZiB0b1hNTChzZWxmLCB3cml0ZXIsIHR0Rm9udCk6CisJCWZvcm1hdHN0cmluZywgbmFtZXMsIGZpeGVzID0gc3N0cnVjdC5nZXRmb3JtYXQodmhlYUZvcm1hdCkKKwkJZm9yIG5hbWUgaW4gbmFtZXM6CisJCQl2YWx1ZSA9IGdldGF0dHIoc2VsZiwgbmFtZSkKKwkJCWlmIHR5cGUodmFsdWUpID09IHR5cGUoMEwpOgorCQkJCXZhbHVlID0gaW50KHZhbHVlKQorCQkJd3JpdGVyLnNpbXBsZXRhZyhuYW1lLCB2YWx1ZT12YWx1ZSkKKwkJCXdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQlzZXRhdHRyKHNlbGYsIG5hbWUsIHNhZmVFdmFsKGF0dHJzWyJ2YWx1ZSJdKSkKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX3ZfbV90X3gucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9fdl9tX3RfeC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJlZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvX3ZfbV90X3gucHkKQEAgLTAsMCArMSwxNCBAQAoraW1wb3J0IERlZmF1bHRUYWJsZQoraW1wb3J0IE51bWVyaWMKK2Zyb20gZm9udFRvb2xzIGltcG9ydCB0dExpYgorZnJvbSBmb250VG9vbHMubWlzYy50ZXh0VG9vbHMgaW1wb3J0IHNhZmVFdmFsCisKK3N1cGVyY2xhc3MgPSB0dExpYi5nZXRUYWJsZUNsYXNzKCJobXR4IikKKworY2xhc3MgdGFibGVfX3ZfbV90X3goc3VwZXJjbGFzcyk6CisJCisJaGVhZGVyVGFnID0gJ3ZoZWEnCisJYWR2YW5jZU5hbWUgPSAnaGVpZ2h0JworCXNpZGVCZWFyaW5nTmFtZSA9ICd0c2InCisJbnVtYmVyT2ZNZXRyaWNzTmFtZSA9ICdudW1iZXJPZlZNZXRyaWNzJworCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9vdENvbW1vbi5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL290Q29tbW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTJjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy9vdENvbW1vbi5weQpAQCAtMCwwICsxLDYwNSBAQAorIiIidHRMaWIudGFibGVzLm90Q29tbW9uLnB5IC0tIFZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdmFyaW91cyBPcGVuVHlwZSB0YWJsZXMuCisiIiIKKworaW1wb3J0IHN0cnVjdCwgc3N0cnVjdAoraW1wb3J0IERlZmF1bHRUYWJsZQorZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCisKKworY2xhc3MgYmFzZV9HUE9TX0dTVUIoRGVmYXVsdFRhYmxlLkRlZmF1bHRUYWJsZSk6CisJCisJIiIiQmFzZSBjbGFzcyBmb3IgR1BPUyBhbmQgR1NVQiB0YWJsZXM7IHRoZXkgc2hhcmUgdGhlIHNhbWUgaGlnaC1sZXZlbCBzdHJ1Y3R1cmUuIiIiCisJCisJdmVyc2lvbiA9IDB4MDAwMTAwMDAKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIGRhdGEsIG90Rm9udCk6CisJCXJlYWRlciA9IE9UVGFibGVSZWFkZXIoZGF0YSkKKwkJc2VsZi52ZXJzaW9uID0gcmVhZGVyLnJlYWRMb25nKCkKKwkJaWYgc2VsZi52ZXJzaW9uIDw+IDB4MDAwMTAwMDA6CisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAidW5rbm93biB0YWJsZSB2ZXJzaW9uOiAweCU4eCIgJSBzZWxmLnZlcnNpb24KKwkJCisJCXNlbGYuc2NyaXB0TGlzdCA9IHJlYWRlci5yZWFkVGFibGUoU2NyaXB0TGlzdCwgb3RGb250LCBzZWxmLnRhYmxlVGFnKQorCQlzZWxmLmZlYXR1cmVMaXN0ID0gcmVhZGVyLnJlYWRUYWJsZShGZWF0dXJlTGlzdCwgb3RGb250LCBzZWxmLnRhYmxlVGFnKQorCQlzZWxmLmxvb2t1cExpc3QgPSByZWFkZXIucmVhZFRhYmxlKExvb2t1cExpc3QsIG90Rm9udCwgc2VsZi50YWJsZVRhZykKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQlYWFhYWFgKKwkKKwlkZWYgdG9YTUwoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQluYW1lcyA9IFsoIlNjcmlwdExpc3QiLCAic2NyaXB0TGlzdCIpLCAKKwkJCQkoIkZlYXR1cmVMaXN0IiwgImZlYXR1cmVMaXN0IiksIAorCQkJCSgiTG9va3VwTGlzdCIsICJsb29rdXBMaXN0IildCisJCWZvciBuYW1lLCBhdHRyIGluIG5hbWVzOgorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQkJeG1sV3JpdGVyLmJlZ2ludGFnKG5hbWUpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQl0YWJsZSA9IGdldGF0dHIoc2VsZiwgYXR0cikKKwkJCXRhYmxlLnRvWE1MKHhtbFdyaXRlciwgb3RGb250KQorCQkJeG1sV3JpdGVyLmVuZHRhZyhuYW1lKQorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCisJZGVmIGZyb21YTUwoc2VsZiwgKG5hbWUsIGF0dHJzLCBjb250ZW50KSwgb3RGb250KToKKwkJeHh4CisKKworIworIyBTY3JpcHQgTGlzdCBhbmQgc3VidGFibGVzCisjCisKK2NsYXNzIFNjcmlwdExpc3Q6CisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudFRhZyk6CisJCXNlbGYucGFyZW50VGFnID0gcGFyZW50VGFnCisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXNjcmlwdENvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLnNjcmlwdHMgPSByZWFkZXIucmVhZFRhZ0xpc3Qoc2NyaXB0Q291bnQsIFNjcmlwdCwgb3RGb250KQorCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCVhYWFhYWAorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCWZvciB0YWcsIHNjcmlwdCBpbiBzZWxmLnNjcmlwdHM6CisJCQl4bWxXcml0ZXIuYmVnaW50YWcoIlNjcmlwdCIsIHRhZz10YWcpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQlzY3JpcHQudG9YTUwoeG1sV3JpdGVyLCBvdEZvbnQpCisJCQl4bWxXcml0ZXIuZW5kdGFnKCJTY3JpcHQiKQorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIG90Rm9udCk6CisJCXh4eAorCisKK2NsYXNzIFNjcmlwdDoKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJc2VsZi5kZWZhdWx0TGFuZ1N5c3RlbSA9IE5vbmUKKwkJc2VsZi5kZWZhdWx0TGFuZ1N5c3RlbSA9IHJlYWRlci5yZWFkVGFibGUoTGFuZ3VhZ2VTeXN0ZW0sIG90Rm9udCkKKwkJbGFuZ1N5c0NvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLmxhbmd1YWdlU3lzdGVtcyA9IHJlYWRlci5yZWFkVGFnTGlzdChsYW5nU3lzQ291bnQsIExhbmd1YWdlU3lzdGVtLCBvdEZvbnQpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJWFhYWFgKKwkKKwlkZWYgdG9YTUwoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQl4bWxXcml0ZXIuYmVnaW50YWcoIkRlZmF1bHRMYW5ndWFnZVN5c3RlbSIpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkJc2VsZi5kZWZhdWx0TGFuZ1N5c3RlbS50b1hNTCh4bWxXcml0ZXIsIG90Rm9udCkKKwkJeG1sV3JpdGVyLmVuZHRhZygiRGVmYXVsdExhbmd1YWdlU3lzdGVtIikKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQlmb3IgdGFnLCBsYW5nU3lzIGluIHNlbGYubGFuZ3VhZ2VTeXN0ZW1zOgorCQkJeG1sV3JpdGVyLmJlZ2ludGFnKCJMYW5ndWFnZVN5c3RlbSIsIHRhZz10YWcpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQlsYW5nU3lzLnRvWE1MKHhtbFdyaXRlciwgb3RGb250KQorCQkJeG1sV3JpdGVyLmVuZHRhZygiTGFuZ3VhZ2VTeXN0ZW0iKQorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCisKK2NsYXNzIExhbmd1YWdlU3lzdGVtOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlzZWxmLmxvb2t1cE9yZGVyID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLnJlcUZlYXR1cmVJbmRleCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJZmVhdHVyZUNvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLmZlYXR1cmVJbmRleCA9IHJlYWRlci5yZWFkVVNob3J0QXJyYXkoZmVhdHVyZUNvdW50KQorCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCXh4eAorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCXhtbFdyaXRlci5zaW1wbGV0YWcoIkxvb2t1cE9yZGVyIiwgdmFsdWU9c2VsZi5sb29rdXBPcmRlcikKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQl4bWxXcml0ZXIuc2ltcGxldGFnKCJSZXFGZWF0dXJlIiwgaW5kZXg9aGV4KHNlbGYucmVxRmVhdHVyZUluZGV4KSkKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQlmb3IgaW5kZXggaW4gc2VsZi5mZWF0dXJlSW5kZXg6CisJCQl4bWxXcml0ZXIuc2ltcGxldGFnKCJGZWF0dXJlIiwgaW5kZXg9aW5kZXgpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisKKworIworIyBGZWF0dXJlIExpc3QgYW5kIHN1YnRhYmxlcworIworCitjbGFzcyBGZWF0dXJlTGlzdDoKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgcGFyZW50VGFnKToKKwkJc2VsZi5wYXJlbnRUYWcgPSBwYXJlbnRUYWcKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJZmVhdHVyZUNvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLmZlYXR1cmVzID0gcmVhZGVyLnJlYWRUYWdMaXN0KGZlYXR1cmVDb3VudCwgRmVhdHVyZSwgb3RGb250KQorCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCVhYWFhYCisJCisJZGVmIHRvWE1MKHNlbGYsIHhtbFdyaXRlciwgb3RGb250KToKKwkJZm9yIGluZGV4IGluIHJhbmdlKGxlbihzZWxmLmZlYXR1cmVzKSk6CisJCQl0YWcsIGZlYXR1cmUgPSBzZWxmLmZlYXR1cmVzW2luZGV4XQorCQkJeG1sV3JpdGVyLmJlZ2ludGFnKCJGZWF0dXJlIiwgaW5kZXg9aW5kZXgsIHRhZz10YWcpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQlmZWF0dXJlLnRvWE1MKHhtbFdyaXRlciwgb3RGb250KQorCQkJeG1sV3JpdGVyLmVuZHRhZygiRmVhdHVyZSIpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCBvdEZvbnQpOgorCQl4eHgKKworCitjbGFzcyBGZWF0dXJlOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlzZWxmLmZlYXR1cmVQYXJhbXMgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWxvb2t1cENvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLmxvb2t1cExpc3RJbmRleCA9IHJlYWRlci5yZWFkVVNob3J0QXJyYXkobG9va3VwQ291bnQpCisJCisJZGVmIGNvbXBpbGUoc2VsZiwgb3RGb250KToKKwkJWFhYWFgKKwkKKwlkZWYgdG9YTUwoc2VsZiwgeG1sV3JpdGVyLCBvdEZvbnQpOgorCQl4bWxXcml0ZXIuc2ltcGxldGFnKCJGZWF0dXJlUGFyYW1zIiwgdmFsdWU9aGV4KHNlbGYuZmVhdHVyZVBhcmFtcykpCisJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkJZm9yIGxvb2t1cEluZGV4IGluIHNlbGYubG9va3VwTGlzdEluZGV4OgorCQkJeG1sV3JpdGVyLnNpbXBsZXRhZygiTG9va3VwVGFibGUiLCBpbmRleD1sb29rdXBJbmRleCkKKwkJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCBvdEZvbnQpOgorCQl4eHgKKworCisjCisjIExvb2t1cCBMaXN0IGFuZCBzdWJ0YWJsZXMKKyMKKworY2xhc3MgTG9va3VwTGlzdDoKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgcGFyZW50VGFnKToKKwkJc2VsZi5wYXJlbnRUYWcgPSBwYXJlbnRUYWcKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJbG9va3VwQ291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCXNlbGYubG9va3VwID0gbG9va3VwID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UobG9va3VwQ291bnQpOgorCQkJbG9va3VwLmFwcGVuZChyZWFkZXIucmVhZFRhYmxlKExvb2t1cFRhYmxlLCBvdEZvbnQsIHNlbGYucGFyZW50VGFnKSkKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQlYWFhYWAorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmxvb2t1cCkpOgorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQkJbG9va3VwVGFibGUgPSBzZWxmLmxvb2t1cFtpXQorCQkJeG1sV3JpdGVyLmJlZ2ludGFnKCJMb29rdXBUYWJsZSIsIGluZGV4PWkpCisJCQl4bWxXcml0ZXIubmV3bGluZSgpCisJCQlsb29rdXBUYWJsZS50b1hNTCh4bWxXcml0ZXIsIG90Rm9udCkKKwkJCXhtbFdyaXRlci5lbmR0YWcoIkxvb2t1cFRhYmxlIikKKwkJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCBvdEZvbnQpOgorCQl4eHgKKworCitjbGFzcyBMb29rdXBUYWJsZToKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgcGFyZW50VGFnKToKKwkJc2VsZi5wYXJlbnRUYWcgPSBwYXJlbnRUYWcKKwkKKwlkZWYgZGVjb21waWxlKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJcGFyZW50VGFibGUgPSBvdEZvbnRbc2VsZi5wYXJlbnRUYWddCisJCXNlbGYubG9va3VwVHlwZSA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJc2VsZi5sb29rdXBGbGFnID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzdWJUYWJsZUNvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlzZWxmLnN1YlRhYmxlcyA9IHN1YlRhYmxlcyA9IFtdCisJCWxvb2t1cFR5cGVDbGFzcyA9IHBhcmVudFRhYmxlLmdldExvb2t1cFR5cGVDbGFzcyhzZWxmLmxvb2t1cFR5cGUpCisJCWZvciBpIGluIHJhbmdlKHN1YlRhYmxlQ291bnQpOgorCQkJc3ViVGFibGVzLmFwcGVuZChyZWFkZXIucmVhZFRhYmxlKGxvb2t1cFR5cGVDbGFzcywgb3RGb250KSkKKwkKKwlkZWYgY29tcGlsZShzZWxmLCBvdEZvbnQpOgorCQlYWFhYWFgKKwkKKwlkZWYgX19yZXByX18oc2VsZik6CisJCWlmIG5vdCBoYXNhdHRyKHNlbGYsICJsb29rdXBUeXBlTmFtZSIpOgorCQkJbSA9IHR0TGliLmdldFRhYmxlTW9kdWxlKHNlbGYucGFyZW50VGFnKQorCQkJc2VsZi5sb29rdXBUeXBlTmFtZSA9IG0ubG9va3VwVHlwZUNsYXNzZXNbc2VsZi5sb29rdXBUeXBlXS5fX25hbWVfXworCQlyZXR1cm4gIjwlcyBMb29rdXBUYWJsZSBhdCAleD4iICUgKHNlbGYubG9va3VwVHlwZU5hbWUsIGlkKHNlbGYpKQorCQorCWRlZiB0b1hNTChzZWxmLCB4bWxXcml0ZXIsIG90Rm9udCk6CisJCXhtbFdyaXRlci5zaW1wbGV0YWcoIkxvb2t1cEZsYWciLCB2YWx1ZT1oZXgoc2VsZi5sb29rdXBGbGFnKSkKKwkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQlmb3Igc3ViVGFibGUgaW4gc2VsZi5zdWJUYWJsZXM6CisJCQluYW1lID0gc3ViVGFibGUuX19jbGFzc19fLl9fbmFtZV9fCisJCQl4bWxXcml0ZXIuYmVnaW50YWcobmFtZSkKKwkJCXhtbFdyaXRlci5uZXdsaW5lKCkKKwkJCXN1YlRhYmxlLnRvWE1MKHhtbFdyaXRlciwgb3RGb250KQorCQkJeG1sV3JpdGVyLmVuZHRhZyhuYW1lKQorCQkJeG1sV3JpdGVyLm5ld2xpbmUoKQorCQorCWRlZiBmcm9tWE1MKHNlbGYsIChuYW1lLCBhdHRycywgY29udGVudCksIG90Rm9udCk6CisJCXh4eAorCisKKyMKKyMgT3RoZXIgY29tbW9uIGZvcm1hdHMKKyMKKworY2xhc3MgQ292ZXJhZ2VUYWJsZToKKwkKKwlkZWYgZ2V0R2x5cGhJRHMoc2VsZik6CisJCXJldHVybiBzZWxmLmdseXBoSURzCisJCisJZGVmIGdldEdseXBoTmFtZXMoc2VsZik6CisJCXJldHVybiBzZWxmLmdseXBoTmFtZXMKKwkKKwlkZWYgbWFrZUdseXBoTmFtZXMoc2VsZiwgb3RGb250KToKKwkJc2VsZi5nbHlwaE5hbWVzID0gbWFwKGxhbWJkYSBpLCBvPW90Rm9udC5nZXRHbHlwaE9yZGVyKCk6IG9baV0sIHNlbGYuZ2x5cGhJRHMpCisJCisJZGVmIGRlY29tcGlsZShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCWZvcm1hdCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJaWYgZm9ybWF0ID09IDE6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDEocmVhZGVyLCBvdEZvbnQpCisJCWVsaWYgZm9ybWF0ID09IDI6CisJCQlzZWxmLmRlY29tcGlsZUZvcm1hdDIocmVhZGVyLCBvdEZvbnQpCisJCWVsc2U6CisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAidW5rbm93biBDb3ZlcmFnZSB0YWJsZSBmb3JtYXQ6ICVkIiAlIGZvcm1hdAorCQlzZWxmLm1ha2VHbHlwaE5hbWVzKG90Rm9udCkKKwkKKwlkZWYgZGVjb21waWxlRm9ybWF0MShzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCWdseXBoQ291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCXNlbGYuZ2x5cGhJRHMgPSBnbHlwaElEcyA9IFtdCisJCWZvciBpIGluIHJhbmdlKGdseXBoQ291bnQpOgorCQkJZ2x5cGhJRCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJCWdseXBoSURzLmFwcGVuZChnbHlwaElEKQorCQorCWRlZiBkZWNvbXBpbGVGb3JtYXQyKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJcmFuZ2VDb3VudCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJc2VsZi5nbHlwaElEcyA9IGdseXBoSURzID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UocmFuZ2VDb3VudCk6CisJCQlzdGFydElEID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQkJZW5kSUQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCQlzdGFydENvdmVyYWdlSW5kZXggPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCQlmb3IgZ2x5cGhJRCBpbiByYW5nZShzdGFydElELCBlbmRJRCArIDEpOgorCQkJCWdseXBoSURzLmFwcGVuZChnbHlwaElEKQorCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCSMgYnJ1dGUgZm9yY2UgOy0pCisJCWRhdGExID0gc2VsZi5jb21waWxlRm9ybWF0MShvdEZvbnQpCisJCWRhdGEyID0gc2VsZi5jb21waWxlRm9ybWF0MihvdEZvbnQpCisJCWlmIGxlbihkYXRhMSkgPD0gbGVuKGRhdGEyKToKKwkJCWZvcm1hdCA9IDEKKwkJCXJlYWRlciA9IGRhdGExCisJCWVsc2U6CisJCQlmb3JtYXQgPSAyCisJCQlyZWFkZXIgPSBkYXRhMgorCQlyZXR1cm4gc3RydWN0LnBhY2soIj5IIiwgZm9ybWF0KSArIHJlYWRlcgorCQorCWRlZiBjb21waWxlRm9ybWF0MShzZWxmLCBvdEZvbnQpOgorCQl4eHh4eAorCQlnbHlwaElEcyA9IG1hcChvdEZvbnQuZ2V0R2x5cGhJRCwgc2VsZi5nbHlwaE5hbWVzKQorCQlkYXRhID0gcGFjaygiPkgiLCBsZW4oZ2x5cGhJRHMpKQorCQlwYWNrID0gc3RydWN0LnBhY2sKKwkJZm9yIGdseXBoSUQgaW4gZ2x5cGhJRHM6CisJCQlkYXRhID0gZGF0YSArIHBhY2soIj5IIiwgZ2x5cGhJRCkKKwkJcmV0dXJuIGRhdGEKKwkKKwlkZWYgY29tcGlsZUZvcm1hdDIoc2VsZiwgb3RGb250KToKKwkJeHh4eHgKKwkJZ2x5cGhJRHMgPSBtYXAob3RGb250LmdldEdseXBoSUQsIHNlbGYuZ2x5cGhOYW1lcykKKwkJcmFuZ2VzID0gW10KKwkJbGFzdElEID0gc3RhcnRJRCA9IGdseXBoSURzWzBdCisJCXN0YXJ0Q292ZXJhZ2VJbmRleCA9IDAKKwkJZ2x5cGhDb3VudCA9IGxlbihnbHlwaElEcykKKwkJZm9yIGkgaW4gcmFuZ2UoMSwgZ2x5cGhDb3VudCsxKToKKwkJCWlmIGkgPT0gZ2x5cGhDb3VudDoKKwkJCQlnbHlwaElEID0gMHgxZmZmZiAgIyBhcmJpdHJhcnksIGJ1dCBsYXJnZXIgdGhhbiAweDEwMDAwCisJCQllbHNlOgorCQkJCWdseXBoSUQgPSBnbHlwaElEc1tpXQorCQkJaWYgZ2x5cGhJRCA8PiAobGFzdElEICsgMSk6CisJCQkJcmFuZ2VzLmFwcGVuZCgoc3RhcnRJRCwgbGFzdElELCBzdGFydENvdmVyYWdlSW5kZXgpKQorCQkJCXN0YXJ0Q292ZXJhZ2VJbmRleCA9IGkKKwkJCQlzdGFydElEID0gZ2x5cGhJRAorCQkJbGFzdElEID0gZ2x5cGhJRAorCQlyYW5nZXMuc29ydCgpICAjIHNvcnQgYnkgc3RhcnRJRAorCQlyYW5nZURhdGEgPSAiIgorCQlmb3Igc3RhcnRJRCwgZW5kSUQsIHN0YXJ0Q292ZXJhZ2VJbmRleCBpbiByYW5nZXM6CisJCQlyYW5nZURhdGEgPSByYW5nZURhdGEgKyBzdHJ1Y3QucGFjaygiPkhISCIsIHN0YXJ0SUQsIGVuZElELCBzdGFydENvdmVyYWdlSW5kZXgpCisJCXJldHVybiBwYWNrKCI+SCIsIGxlbihyYW5nZXMpKSArIHJhbmdlRGF0YQorCisKK2NsYXNzIENsYXNzRGVmaW5pdGlvblRhYmxlOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQlmb3JtYXQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWlmIGZvcm1hdCA9PSAxOgorCQkJc2VsZi5kZWNvbXBpbGVGb3JtYXQxKHJlYWRlciwgb3RGb250KQorCQllbGlmIGZvcm1hdCA9PSAyOgorCQkJc2VsZi5kZWNvbXBpbGVGb3JtYXQyKHJlYWRlciwgb3RGb250KQorCQllbHNlOgorCQkJcmFpc2UgdHRMaWIuVFRMaWJFcnJvciwgInVua25vd24gQ2xhc3MgdGFibGUgZm9ybWF0OiAlZCIgJSBmb3JtYXQKKwkJc2VsZi5yZXZlcnNlKCkKKwkKKwlkZWYgcmV2ZXJzZShzZWxmKToKKwkJY2xhc3NEZWZzID0ge30KKwkJZm9yIGdseXBoTmFtZSwgY2xhc3NDb2RlIGluIHNlbGYuY2xhc3NEZWZzOgorCQkJdHJ5OgorCQkJCWNsYXNzRGVmc1tjbGFzc0NvZGVdLmFwcGVuZChnbHlwaE5hbWUpCisJCQlleGNlcHQgS2V5RXJyb3I6CisJCQkJY2xhc3NEZWZzW2NsYXNzQ29kZV0gPSBbZ2x5cGhOYW1lXQorCQlzZWxmLmNsYXNzRGVmcyA9IGNsYXNzRGVmcworCQorCWRlZiBkZWNvbXBpbGVGb3JtYXQxKHNlbGYsIHJlYWRlciwgb3RGb250KToKKwkJc2VsZi5jbGFzc0RlZnMgPSBjbGFzc0RlZnMgPSBbXQorCQlzdGFydEdseXBoSUQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWdseXBoQ291bnQgPSByZWFkZXIucmVhZFVTaG9ydCgpCisJCWZvciBpIGluIHJhbmdlKGdseXBoQ291bnQpOgorCQkJZ2x5cGhOYW1lID0gb3RGb250LmdldGdseXBoTmFtZShzdGFydEdseXBoSUQgKyBpKQorCQkJY2xhc3NWYWx1ZSA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJCWlmIGNsYXNzVmFsdWU6CisJCQkJY2xhc3NEZWZzLmFwcGVuZCgoZ2x5cGhOYW1lLCBjbGFzc1ZhbHVlKSkKKwkKKwlkZWYgZGVjb21waWxlRm9ybWF0MihzZWxmLCByZWFkZXIsIG90Rm9udCk6CisJCXNlbGYuY2xhc3NEZWZzID0gY2xhc3NEZWZzID0gW10KKwkJY2xhc3NSYW5nZUNvdW50ID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQlmb3IgaSBpbiByYW5nZShjbGFzc1JhbmdlQ291bnQpOgorCQkJc3RhcnRJRCA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJCWVuZElEID0gcmVhZGVyLnJlYWRVU2hvcnQoKQorCQkJY2xhc3NWYWx1ZSA9IHJlYWRlci5yZWFkVVNob3J0KCkKKwkJCWZvciBnbHlwaElEIGluIHJhbmdlKHN0YXJ0SUQsIGVuZElEICsgMSk6CisJCQkJaWYgY2xhc3NWYWx1ZToKKwkJCQkJZ2x5cGhOYW1lID0gb3RGb250LmdldEdseXBoTmFtZShnbHlwaElEKQorCQkJCQljbGFzc0RlZnMuYXBwZW5kKChnbHlwaE5hbWUsIGNsYXNzVmFsdWUpKQorCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCSMgYnJ1dGUgZm9yY2UgYWdhaW4KKwkJZGF0YTEgPSBzZWxmLmNvbXBpbGVGb3JtYXQxKG90Rm9udCkKKwkJZGF0YTIgPSBzZWxmLmNvbXBpbGVGb3JtYXQyKG90Rm9udCkKKwkJaWYgbGVuKGRhdGExKSA8PSBsZW4oZGF0YTIpOgorCQkJZm9ybWF0ID0gMQorCQkJZGF0YSA9IGRhdGExCisJCWVsc2U6CisJCQlmb3JtYXQgPSAyCisJCQlkYXRhID0gZGF0YTIKKwkJcmV0dXJuIHN0cnVjdC5wYWNrKCI+SCIsIGZvcm1hdCkgKyBkYXRhCisJCisJZGVmIGNvbXBpbGVGb3JtYXQxKHNlbGYsIG90Rm9udCk6CisJCWl0ZW1zID0gbWFwKGxhbWJkYSAoZ2x5cGhOYW1lLCBjbGFzc1ZhbHVlKSwgZ2V0R2x5cGhJRD1vdEZvbnQuZ2V0R2x5cGhJRDoKKwkJCQkoZ2V0R2x5cGhJRChnbHlwaE5hbWUpLCBjbGFzc1ZhbHVlKSwgc2VsZi5nbHlwaHMuaXRlbXMoKSkKKwkJaXRlbXMuc29ydCgpCisJCXN0YXJ0R2x5cGhJRCA9IGl0ZW1zWzBdWzBdCisJCWVuZEdseXBoSUQgPSBpdGVtc1stMV1bMF0KKwkJZGF0YSA9ICIiCisJCWxhc3RJRCA9IHN0YXJ0R2x5cGhJRAorCQlmb3IgZ2x5cGhJRCwgY2xhc3NWYWx1ZSBpbiBpdGVtczoKKwkJCWZvciBpIGluIHJhbmdlKGxhc3RJRCArIDEsIGdseXBoSUQgLSAxKToKKwkJCQlkYXRhID0gZGF0YSArICJcMFwwIiAgIyAwID09IGRlZmF1bHQgY2xhc3MKKwkJCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIj5IIiwgY2xhc3NWYWx1ZSkKKwkJCWxhc3RJRCA9IGdseXBoSUQKKwkJcmV0dXJuIHN0cnVjdC5wYWNrKCI+SCIsIGVuZEdseXBoSUQgLSBzdGFydEdseXBoSUQgKyAxKSArIGRhdGEKKwkKKwlkZWYgY29tcGlsZUZvcm1hdDIoc2VsZiwgb3RGb250KToKKwkJaXRlbXMgPSBtYXAobGFtYmRhIChnbHlwaE5hbWUsIGNsYXNzVmFsdWUpLCBnZXRHbHlwaElEPW90Rm9udC5nZXRHbHlwaElEOgorCQkJCShnZXRHbHlwaElEKGdseXBoTmFtZSksIGNsYXNzVmFsdWUpLCBzZWxmLmdseXBocy5pdGVtcygpKQorCQlpdGVtcy5zb3J0KCkKKwkJcmFuZ2VzID0gW10KKwkJbGFzdElELCBsYXN0Q2xhc3NWYWx1ZSA9IGl0ZW1zWzBdWzBdCisJCXN0YXJ0SUQgPSBsYXN0SUQKKwkJaXRlbUNvdW50ID0gbGVuKGl0ZW1zKQorCQlmb3IgaSBpbiByYW5nZSgxLCBpdGVtQ291bnQrMSk6CisJCQlpZiBpID09IGl0ZW1Db3VudDoKKwkJCQlnbHlwaElEID0gMHgxZmZmZiAgIyBhcmJpdHJhcnksIGJ1dCBsYXJnZXIgdGhhbiAweDEwMDAwCisJCQkJY2xhc3NWYWx1ZSA9IDAKKwkJCWVsc2U6CisJCQkJZ2x5cGhJRCwgY2xhc3NWYWx1ZSA9IGl0ZW1zW2ldCisJCQlpZiBnbHlwaElEIDw+IChsYXN0SUQgKyAxKSBvciBsYXN0Q2xhc3NWYWx1ZSA8PiBjbGFzc1ZhbHVlOgorCQkJCXJhbmdlcy5hcHBlbmQoKHN0YXJ0SUQsIGxhc3RJRCwgbGFzdENsYXNzVmFsdWUpKQorCQkJCXN0YXJ0SUQgPSBnbHlwaElECisJCQkJbGFzdENsYXNzVmFsdWUgPSBjbGFzc1ZhbHVlCisJCQlsYXN0SUQgPSBnbHlwaElECisJCQlsYXN0Q2xhc3NWYWx1ZSA9IGNsYXNzVmFsdWUKKwkJcmFuZ2VEYXRhID0gIiIKKwkJZm9yIHN0YXJ0SUQsIGVuZElELCBjbGFzc1ZhbHVlIGluIHJhbmdlczoKKwkJCXJhbmdlRGF0YSA9IHJhbmdlRGF0YSArIHN0cnVjdC5wYWNrKCI+SEhIIiwgc3RhcnRJRCwgZW5kSUQsIGNsYXNzVmFsdWUpCisJCXJldHVybiBwYWNrKCI+SCIsIGxlbihyYW5nZXMpKSArIHJhbmdlRGF0YQorCQorCWRlZiBfX2dldGl0ZW1fXyhzZWxmLCBnbHlwaE5hbWUpOgorCQlpZiBzZWxmLmdseXBocy5oYXNfa2V5KGdseXBoTmFtZSk6CisJCQlyZXR1cm4gc2VsZi5nbHlwaHNbZ2x5cGhOYW1lXQorCQllbHNlOgorCQkJcmV0dXJuIDAgICMgZGVmYXVsdCBjbGFzcworCisKK2NsYXNzIERldmljZVRhYmxlOgorCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgcmVhZGVyLCBvdEZvbnQpOgorCQl4eHh4eHgKKwkJc2VsZi5zdGFydFNpemUgPSB1bnBhY2tfdWludDE2KHJlYWRlcls6Ml0pCisJCWVuZFNpemUgPSB1bnBhY2tfdWludDE2KHJlYWRlclsyOjRdKQorCQlkZWx0YUZvcm1hdCA9IHVucGFja191aW50MTYocmVhZGVyWzQ6Nl0pCisJCXJlYWRlciA9IHJlYWRlcls2Ol0KKwkJaWYgZGVsdGFGb3JtYXQgPT0gMToKKwkJCWJpdHMgPSAyCisJCWVsaWYgZGVsdGFGb3JtYXQgPT0gMjoKKwkJCWJpdHMgPSA0CisJCWVsaWYgZGVsdGFGb3JtYXQgPT0gMzoKKwkJCWJpdHMgPSA4CisJCWVsc2U6CisJCQlyYWlzZSB0dExpYi5UVExpYkVycm9yLCAidW5rbm93biBEZXZpY2UgdGFibGUgZGVsdGEgZm9ybWF0OiAlZCIgJSBkZWx0YUZvcm1hdAorCQludW1Db3VudCA9IDE2IC8gYml0cworCQlkZWx0YUNvdW50ID0gZW5kU2l6ZSAtIHNlbGYuc3RhcnRTaXplICsgMQorCQlkZWx0YVZhbHVlcyA9IFtdCisJCW1hc2sgPSAoMSA8PCBiaXRzKSAtIDEKKwkJdGhyZXNob2xkID0gKDEgPDwgYml0cykgLyAyCisJCXNoaWZ0ID0gMSA8PCBiaXRzCisJCWZvciBpIGluIHJhbmdlKDAsIGRlbHRhQ291bnQsIG51bUNvdW50KToKKwkJCW9mZnNldCA9IDIqaS9udW1Db3VudAorCQkJY2h1bmsgPSB1bnBhY2tfdWludDE2KHJlYWRlcltvZmZzZXQ6b2Zmc2V0KzJdKQorCQkJZGVsdGFzID0gW10KKwkJCWZvciBqIGluIHJhbmdlKG51bUNvdW50KToKKwkJCQlkZWx0YSA9IGNodW5rICYgbWFzaworCQkJCWlmIGRlbHRhID49IHRocmVzaG9sZDoKKwkJCQkJZGVsdGEgPSBkZWx0YSAtIHNoaWZ0CisJCQkJZGVsdGFzLmFwcGVuZChkZWx0YSkKKwkJCQljaHVuayA9IGNodW5rID4+IGJpdHMKKwkJCWRlbHRhcy5yZXZlcnNlKCkKKwkJCWRlbHRhVmFsdWVzID0gZGVsdGFWYWx1ZXMgKyBkZWx0YXMKKwkJc2VsZi5kZWx0YVZhbHVlcyA9IGRlbHRhVmFsdWVzWzpkZWx0YUNvdW50XQorCQorCWRlZiBjb21waWxlKHNlbGYsIG90Rm9udCk6CisJCWRlbHRhVmFsdWVzID0gc2VsZi5kZWx0YVZhbHVlcworCQlzdGFydFNpemUgPSBzZWxmLnN0YXJ0U2l6ZQorCQllbmRTaXplID0gc3RhcnRTaXplICsgbGVuKGRlbHRhVmFsdWVzKSAtIDEKKwkJc21hbGxlc3REZWx0YSA9IG1pbihkZWx0YXMpCisJCWxhcmdlc3REZWx0YSA9IG1hKGRlbHRhcykKKwkJaWYgc21hbGxlc3REZWx0YSA+PSAtMiBhbmQgbGFyZ2VzdERlbHRhIDwgMjoKKwkJCWRlbHRhRm9ybWF0ID0gMQorCQkJYml0cyA9IDIKKwkJZWxpZiBzbWFsbGVzdERlbHRhID49IC04IGFuZCBsYXJnZXN0RGVsdGEgPCA4OgorCQkJZGVsdGFGb3JtYXQgPSAyCisJCQliaXRzID0gNAorCQllbGlmIHNtYWxsZXN0RGVsdGEgPj0gLTEyOCBhbmQgbGFyZ2VzdERlbHRhIDwgMTI4OgorCQkJZGVsdGFGb3JtYXQgPSAzCisJCQliaXRzID0gOAorCQllbHNlOgorCQkJcmFpc2UgdHRMaWIuVFRMaWJFcnJvciwgImRlbHRhIHZhbHVlIHRvbyBsYXJnZTogbWluPSVkLCBtYXg9JWQiICUgKHNtYWxsZXN0RGVsdGEsIGxhcmdlc3REZWx0YSkKKwkJZGF0YSA9IHN0cnVjdC5wYWNrKCI+SEhIIiwgc3RhcnRTaXplLCBlbmRTaXplLCBkZWx0YUZvcm1hdCkKKwkJbnVtQ291bnQgPSAxNiAvIGJpdHMKKwkJIyBwYWQgdGhlIGxpc3QgdG8gYSBtdWx0aXBsZSBvZiBudW1Db3VudCB2YWx1ZXMKKwkJcmVtYWluZGVyID0gbGVuKGRlbHRhVmFsdWVzKSAlIG51bUNvdW50CisJCWlmIHJlbWFpbmRlcjoKKwkJCWRlbHRhVmFsdWVzID0gZGVsdGFWYWx1ZXMgKyBbMF0gKiAobnVtQ291bnQgLSByZW1haW5kZXIpCisJCWRlbHRhRGF0YSA9ICIiCisJCWZvciBpIGluIHJhbmdlKDAsIGxlbihkZWx0YVZhbHVlcyksIG51bUNvdW50KToKKwkJCWNodW5rID0gMAorCQkJZm9yIGogaW4gcmFuZ2UobnVtQ291bnQpOgorCQkJCWNodW5rID0gY2h1bmsgPDwgYml0cworCQkJCWNodW5rID0gY2h1bmsgfCBkZWx0YVZhbHVlc1tpK2pdCisJCQlkZWx0YURhdGEgPSBkZWx0YURhdGEgKyBzdHJ1Y3QucGFjaygiPkgiLCBjaHVuaykKKwkJcmV0dXJuIGRhdGEgKyBkZWx0YURhdGEKKworCisjCisjIE1pc2NlbGFuZW91cyBoZWxwZXIgcm91dGluZXMgYW5kIGNsYXNzZXMKKyMKKworY2xhc3MgT1RUYWJsZVJlYWRlcjoKKwkKKwkiIiJEYXRhIHdyYXBwZXIsIG1vc3RseSBkZXNpZ25lZCB0byBtYWtlIHJlYWRpbmcgT1QgZGF0YSBsZXNzIGN1bWJlcnNvbWUuIiIiCisJCisJZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIG9mZnNldD0wKToKKwkJc2VsZi5kYXRhID0gZGF0YQorCQlzZWxmLm9mZnNldCA9IG9mZnNldAorCQlzZWxmLnBvcyA9IG9mZnNldAorCQorCWRlZiByZWFkVVNob3J0KHNlbGYpOgorCQlwb3MgPSBzZWxmLnBvcworCQluZXdwb3MgPSBwb3MgKyAyCisJCXZhbHVlID0gaW50KHN0cnVjdC51bnBhY2soIj5IIiwgc2VsZi5kYXRhW3BvczpuZXdwb3NdKVswXSkKKwkJc2VsZi5wb3MgPSBuZXdwb3MKKwkJcmV0dXJuIHZhbHVlCisJCisJcmVhZE9mZnNldCA9IHJlYWRVU2hvcnQKKwkKKwlkZWYgcmVhZFNob3J0KHNlbGYpOgorCQlwb3MgPSBzZWxmLnBvcworCQluZXdwb3MgPSBwb3MgKyAyCisJCXZhbHVlID0gaW50KHN0cnVjdC51bnBhY2soIj5oIiwgc2VsZi5kYXRhW3BvczpuZXdwb3NdKVswXSkKKwkJc2VsZi5wb3MgPSBuZXdwb3MKKwkJcmV0dXJuIHZhbHVlCisJCisJZGVmIHJlYWRMb25nKHNlbGYpOgorCQlwb3MgPSBzZWxmLnBvcworCQluZXdwb3MgPSBwb3MgKyA0CisJCXZhbHVlID0gaW50KHN0cnVjdC51bnBhY2soIj5sIiwgc2VsZi5kYXRhW3BvczpuZXdwb3NdKVswXSkKKwkJc2VsZi5wb3MgPSBuZXdwb3MKKwkJcmV0dXJuIHZhbHVlCisJCisJZGVmIHJlYWRUYWcoc2VsZik6CisJCXBvcyA9IHNlbGYucG9zCisJCW5ld3BvcyA9IHBvcyArIDQKKwkJdmFsdWUgPSBzZWxmLmRhdGFbcG9zOm5ld3Bvc10KKwkJYXNzZXJ0IGxlbih2YWx1ZSkgPT0gNAorCQlzZWxmLnBvcyA9IG5ld3BvcworCQlyZXR1cm4gdmFsdWUKKwkKKwlkZWYgcmVhZFVTaG9ydEFycmF5KHNlbGYsIGNvdW50KToKKwkJcmV0dXJuIHNlbGYucmVhZEFycmF5KGNvdW50LCAiSCIpCisJCisJcmVhZE9mZnNldEFycmF5ID0gcmVhZFVTaG9ydEFycmF5CisJCisJZGVmIHJlYWRTaG9ydEFycmF5KHNlbGYsIGNvdW50KToKKwkJcmV0dXJuIHNlbGYucmVhZEFycmF5KGNvdW50LCAiaCIpCisJCisJZGVmIHJlYWRBcnJheShzZWxmLCBjb3VudCwgZm9ybWF0KToKKwkJYXNzZXJ0IGZvcm1hdCBpbiAiSGgiCisJCWZyb20gYXJyYXkgaW1wb3J0IGFycmF5CisJCXBvcyA9IHNlbGYucG9zCisJCW5ld3BvcyA9IHBvcyArIDIgKiBjb3VudAorCQlhID0gYXJyYXkoZm9ybWF0KQorCQlhLmZyb21zdHJpbmcoc2VsZi5kYXRhW3BvczpuZXdwb3NdKQorCQlpZiB0dExpYi5lbmRpYW4gPD4gJ2JpZyc6CisJCQlhLmJ5dGVzd2FwKCkKKwkJc2VsZi5wb3MgPSBuZXdwb3MKKwkJcmV0dXJuIGEudG9saXN0KCkKKwkKKwlkZWYgcmVhZFRhYmxlKHNlbGYsIHRhYmxlQ2xhc3MsIG90Rm9udCwgKmFyZ3MpOgorCQlvZmZzZXQgPSBzZWxmLnJlYWRPZmZzZXQoKQorCQlpZiBvZmZzZXQgPT0gMDoKKwkJCXJldHVybiBOb25lCisJCW5ld1JlYWRlciA9IHNlbGYuZ2V0U3ViU3RyaW5nKG9mZnNldCkKKwkJdGFibGUgPSBhcHBseSh0YWJsZUNsYXNzLCBhcmdzKQorCQl0YWJsZS5kZWNvbXBpbGUobmV3UmVhZGVyLCBvdEZvbnQpCisJCXJldHVybiB0YWJsZQorCQorCWRlZiByZWFkVGFibGVBcnJheShzZWxmLCBjb3VudCwgdGFibGVDbGFzcywgb3RGb250LCAqYXJncyk6CisJCWxpc3QgPSBbXQorCQlmb3IgaSBpbiByYW5nZShjb3VudCk6CisJCQlsaXN0LmFwcGVuZChhcHBseShzZWxmLnJlYWRUYWJsZSwgKHRhYmxlQ2xhc3MsIG90Rm9udCkgKyBhcmdzKSkKKwkJcmV0dXJuIGxpc3QKKwkKKwlkZWYgcmVhZFRhZ0xpc3Qoc2VsZiwgY291bnQsIHRhYmxlQ2xhc3MsIG90Rm9udCwgKmFyZ3MpOgorCQlsaXN0ID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UoY291bnQpOgorCQkJdGFnID0gc2VsZi5yZWFkVGFnKCkKKwkJCXRhYmxlID0gYXBwbHkoc2VsZi5yZWFkVGFibGUsICh0YWJsZUNsYXNzLCBvdEZvbnQpICsgYXJncykKKwkJCWxpc3QuYXBwZW5kKCh0YWcsIHRhYmxlKSkKKwkJcmV0dXJuIGxpc3QKKwkKKwlkZWYgcmVhZFN0cnVjdChzZWxmLCBmb3JtYXQsIHNpemU9Tm9uZSk6CisJCWlmIHNpemUgaXMgTm9uZToKKwkJCXNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoZm9ybWF0KQorCQllbHNlOgorCQkJYXNzZXJ0IHNpemUgPT0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKwkJcG9zID0gc2VsZi5wb3MKKwkJbmV3cG9zID0gcG9zICsgc2l6ZQorCQl2YWx1ZXMgPSBzdHJ1Y3QudW5wYWNrKGZvcm1hdCwgc2VsZi5kYXRhW3BvczpuZXdwb3NdKQorCQlzZWxmLnBvcyA9IG5ld3BvcworCQlyZXR1cm4gdmFsdWVzCisJCisJZGVmIGdldFN1YlN0cmluZyhzZWxmLCBvZmZzZXQpOgorCQlyZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLCBzZWxmLm9mZnNldCtvZmZzZXQpCisJCisJZGVmIHNlZWsoc2VsZiwgbik6CisJCSIiIlJlbGF0aXZlIHNlZWsuIiIiCisJCXNlbGYucG9zID0gc2VsZi5wb3MgKyBuCisKKwpkaWZmIC0tZ2l0IGEvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvdGFibGVfQVBJX3JlYWRtZS50eHQgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy90YWJsZV9BUElfcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA0YmY4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2ZvbnRUb29scy90dExpYi90YWJsZXMvdGFibGVfQVBJX3JlYWRtZS50eHQKQEAgLTAsMCArMSw5MSBAQAorVGhpcyBmb2xkZXIgaXMgYSBzdWJwYWNrYWdlIG9mIHR0TGliLiBFYWNoIG1vZHVsZSBoZXJlIGlzIGEgCitzcGVjaWFsaXplZCBUVC9PVCB0YWJsZSBjb252ZXJ0ZXI6IHRoZXkgY2FuIGNvbnZlcnQgcmF3IGRhdGEgCit0byBQeXRob24gb2JqZWN0cyBhbmQgdmljZSB2ZXJzYS4gVXN1YWxseSB5b3UgZG9uJ3QgbmVlZCB0byAKK3VzZSB0aGUgbW9kdWxlcyBkaXJlY3RseTogdGhleSBhcmUgaW1wb3J0ZWQgYW5kIHVzZWQgCithdXRvbWF0aWNhbGx5IHdoZW4gbmVlZGVkIGJ5IHR0TGliLgorCitJZiB5b3UgYXJlIHdyaXRpbmcgeW91IG93biB0YWJsZSBjb252ZXJ0ZXIgdGhlIGZvbGxvd2luZyBpcyAKK2ltcG9ydGFudC4KKworVGhlIG1vZHVsZXMgaGVyZSBoYXZlIHByZXR0eSBzdHJhbmdlIG5hbWVzOiB0aGlzIGlzIGR1ZSB0byB0aGUgCitmYWN0IHRoYXQgd2UgbmVlZCB0byBtYXAgVFQgdGFibGUgdGFncyAod2hpY2ggYXJlIGNhc2Ugc2Vuc2l0aXZlKSAKK3RvIGZpbGVuYW1lcyAod2hpY2ggb24gTWFjIGFuZCBXaW4gYXJlbid0IGNhc2Ugc2Vuc2l0aXZlKSBhcyB3ZWxsIAorYXMgdG8gUHl0aG9uIGlkZW50aWZpZXJzLiBUaGUgbGF0dGVyIG1lYW5zIGl0IGNhbiBvbmx5IGNvbnRhaW4gCitbQS1aYS16MC05X10gYW5kIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLiAKKwordHRMaWIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGV4cGFuZCBhIHRhZyBpbnRvIHRoZSBmb3JtYXQgdXNlZCBoZXJlOgorCis+Pj4gZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCis+Pj4gdHRMaWIudGFnMmlkZW50aWZpZXIoIkZPTyAiKQorJ0ZfT19PXycKKz4+PiB0dExpYi50YWcyaWRlbnRpZmllcigiY3Z0ICIpCisnX2Nfdl90JworPj4+IHR0TGliLnRhZzJpZGVudGlmaWVyKCJPUy8yIikKKydPX1NfMmZfMicKKz4+PiB0dExpYi50YWcyaWRlbnRpZmllcigiZ2x5ZiIpCisnX2dfbF95X2YnCis+Pj4gCisKK0FuZCB2aWNlIHZlcnNhOgorCis+Pj4gdHRMaWIuaWRlbnRpZmllcjJ0YWcoIkZfT19PXyIpCisnRk9PICcKKz4+PiB0dExpYi5pZGVudGlmaWVyMnRhZygiX2Nfdl90IikKKydjdnQgJworPj4+IHR0TGliLmlkZW50aWZpZXIydGFnKCJPX1NfMmZfMiIpCisnT1MvMicKKz4+PiB0dExpYi5pZGVudGlmaWVyMnRhZygiX2dfbF95X2YiKQorJ2dseWYnCis+Pj4gCisKK0VnLiB0aGUgJ2dseWYnIHRhYmxlIGNvbnZlcnRlciBsaXZlcyBpbiBhIFB5dGhvbiBmaWxlIGNhbGxlZDoKKworCV9nX2xfeV9mLnB5CisKK1RoZSBjb252ZXJ0ZXIgaXRzZWxmIGlzIGEgY2xhc3MsIG5hbWVkICJ0YWJsZV8iICsgZXhwYW5kZWR0YWcuIEVnOgorCisJY2xhc3MgdGFibGVfX2dfbF95X2Y6CisJCWV0Yy4KKworTm90ZSB0aGF0IGlmIHlvdSBfZG9fIG5lZWQgdG8gdXNlIHN1Y2ggbW9kdWxlcyBvciBjbGFzc2VzIG1hbnVhbGx5LCAKK3RoZXJlIGFyZSB0d28gY29udmVuaWVudCBBUEkgZnVuY3Rpb25zIHRoYXQgbGV0IHlvdSBmaW5kIHRoZW0gYnkgdGFnOgorCis+Pj4gdHRMaWIuZ2V0VGFibGVNb2R1bGUoJ2dseWYnKQorPG1vZHVsZSAndHRMaWIudGFibGVzLl9nX2xfeV9mJz4KKz4+PiB0dExpYi5nZXRUYWJsZUNsYXNzKCdnbHlmJykKKzxjbGFzcyB0dExpYi50YWJsZXMuX2dfbF95X2YudGFibGVfX2dfbF95X2YgYXQgNjQ1ZjQwMD4KKz4+PiAKKworWW91IG11c3Qgc3ViY2xhc3MgZnJvbSBEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlLiBJdCBwcm92aWRlcyBzb21lIGRlZmF1bHQKK2JlaGF2aW9yLCBhcyB3ZWxsIGFzIGEgY29uc3RydWN0b3IgbWV0aG9kIChfX2luaXRfXykgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byAKK292ZXJyaWRlLgorCitZb3VyIGNvbnZlcnRlciBzaG91bGQgbWluaW1hbGx5IHByb3ZpZGUgdHdvIG1ldGhvZHM6CisKK2NsYXNzIHRhYmxlX0ZfT19PXyhEZWZhdWx0VGFibGUuRGVmYXVsdFRhYmxlKTogIyBjb252ZXJ0ZXIgZm9yIHRhYmxlICdGT08gJworCQorCWRlZiBkZWNvbXBpbGUoc2VsZiwgZGF0YSwgdHRGb250KToKKwkJIyAnZGF0YScgaXMgdGhlIHJhdyB0YWJsZSBkYXRhLiBVbnBhY2sgaXQgaW50byBhCisJCSMgUHl0aG9uIGRhdGEgc3RydWN0dXJlLgorCQkjICd0dEZvbnQnIGlzIGEgdHRMaWIuVFRmaWxlIGluc3RhbmNlLCBlbmFibGluZyB5b3UgdG8KKwkJIyByZWZlciB0byBvdGhlciB0YWJsZXMuIERvICoqKm5vdCoqKiBrZWVwIGEgcmVmZXJlbmNlIHRvCisJCSMgaXQ6IGl0IHdpbGwgY2F1c2UgYSBjaXJjdWxhciByZWZlcmVuY2UgKHR0Rm9udCBzYXZlcyAKKwkJIyBhIHJlZmVyZW5jZSB0byB1cyksIGFuZCB0aGF0IG1lYW5zIHdlJ2xsIGJlIGxlYWtpbmcgCisJCSMgbWVtb3J5LiBJZiB5b3UgbmVlZCB0byB1c2UgaXQgaW4gb3RoZXIgbWV0aG9kcywganVzdCAKKwkJIyBwYXNzIGl0IGFyb3VuZCBhcyBhIG1ldGhvZCBhcmd1bWVudC4KKwkKKwlkZWYgY29tcGlsZShzZWxmLCB0dEZvbnQpOgorCQkjIFJldHVybiB0aGUgcmF3IGRhdGEsIGFzIGNvbnZlcnRlZCBmcm9tIHRoZSBQeXRob24KKwkJIyBkYXRhIHN0cnVjdHVyZS4gCisJCSMgQWdhaW4sICd0dEZvbnQnIGlzIHRoZXJlIHNvIHlvdSBjYW4gYWNjZXNzIG90aGVyIHRhYmxlcy4KKwkJIyBTYW1lIHdhcm5pbmcgYXBwbGllcy4KKworSWYgeW91IHdhbnQgdG8gc3VwcG9ydCBYTUwgaW1wb3J0L2V4cG9ydCBhcyB3ZWxsLCB5b3UgbmVlZCB0byBwcm92aWRlIHR3bworYWRkaXRpb25hbCBtZXRob2RzOgorCisJZGVmIHRvWE1MKHNlbGYsIHdyaXRlciwgdHRGb250KToKKwkJIyBYWFgKKwkKKwlkZWYgZnJvbVhNTChzZWxmLCAobmFtZSwgYXR0cnMsIGNvbnRlbnQpLCB0dEZvbnQpOgorCQkjIFhYWAorCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy90dFByb2dyYW0ucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3RhYmxlcy90dFByb2dyYW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkOWZhYQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9mb250VG9vbHMvdHRMaWIvdGFibGVzL3R0UHJvZ3JhbS5weQpAQCAtMCwwICsxLDI0OSBAQAorIiIidHRMaWIudGFibGVzLnR0UHJvZ3JhbS5weSAtLSBBc3NlbWJsZXIvZGlzYXNzZW1ibGVyIGZvciBUcnVlVHlwZSBieXRlY29kZSBwcm9ncmFtcy4iIiIKKworaW1wb3J0IGFycmF5CisKKworIyBmaXJzdCwgdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgZWF0IGJ5dGVzIG9yIHdvcmRzIGZyb20gdGhlIGluc3RydWN0aW9uIHN0cmVhbQorCitzdHJlYW1JbnN0cnVjdGlvbnMgPSBbCisjCS0tLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tICAtLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tCisjCW9wY29kZSAgICAgbW5lbW9uaWMgYXJnYml0cyAgICAgICAgIGRlc2NyaXB0aXZlIG5hbWUgcG9wcyBwdXNoZXMgICAgICAgIGVhdHMgZnJvbSBpbnN0cnVjdGlvbiBzdHJlYW0gICAgICAgICAgcHVzaGVzCisjCS0tLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tICAtLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tCisJKDB4NDAsICAgICdOUFVTSEInLCAgICAgMCwgICAgICAgICAgICAgJ1B1c2hOQnl0ZXMnLCAgMCwgLTEpLCAjICAgICAgICAgICAgICAgICAgICAgIG4sIGIxLCBiMiwuLi5ibiAgICAgIGIxLGIyLi4uYm4KKwkoMHg0MSwgICAgJ05QVVNIVycsICAgICAwLCAgICAgICAgICAgICAnUHVzaE5Xb3JkcycsICAwLCAtMSksICMgICAgICAgICAgICAgICAgICAgICAgIG4sIHcxLCB3MiwuLi53ICAgICAgdzEsdzIuLi53bgorCSgweGIwLCAgICAgJ1BVU0hCJywgICAgIDMsICAgICAgICAgICAgICAnUHVzaEJ5dGVzJywgIDAsIC0xKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgYjAsIGIxLC4uYm4gIGIwLCBiMSwgLi4uLGJuCisJKDB4YjgsICAgICAnUFVTSFcnLCAgICAgMywgICAgICAgICAgICAgICdQdXNoV29yZHMnLCAgMCwgLTEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgdzAsdzEsLi53biAgIHcwICx3MSwgLi4ud24KKyMJLS0tLS0tICAtLS0tLS0tLS0tLSAgLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0gIC0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0KK10KKworCisjIG5leHQsIHRoZSBsaXN0IG9mICJub3JtYWwiIGluc3RydWN0aW9ucworCitpbnN0cnVjdGlvbnMgPSBbCisjCS0tLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tICAtLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tCisjCW9wY29kZSAgICAgbW5lbW9uaWMgIGFyZ2JpdHMgICAgICAgIGRlc2NyaXB0aXZlIG5hbWUgcG9wcyBwdXNoZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHMgICAgICAgICAgcHVzaGVzCisjCS0tLS0tLSAgLS0tLS0tLS0tLS0gIC0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tICAtLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tCisJKDB4N2YsICAgICAgICAnQUEnLCAgICAgMCwgICAgICAgICAgICAnQWRqdXN0QW5nbGUnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAgICAgICAgICAgICAgIC0KKwkoMHg2NCwgICAgICAgJ0FCUycsICAgICAwLCAgICAgICAgICAgICAgICdBYnNvbHV0ZScsICAxLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgICAgIHxufAorCSgweDYwLCAgICAgICAnQUREJywgICAgIDAsICAgICAgICAgICAgICAgICAgICAnQWRkJywgIDIsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMiwgbjEgICAgICAgKG4xICsgbjIpCisJKDB4MjcsICAnQUxJR05QVFMnLCAgICAgMCwgICAgICAgICAgICAgICAnQWxpZ25QdHMnLCAgMiwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyLCBwMSAgICAgICAgICAgICAgIC0KKwkoMHgzYywgICAnQUxJR05SUCcsICAgICAwLCAgICAgICAgJ0FsaWduUmVsYXRpdmVQdCcsIC0xLCAgMCksICMgICAgICAgICAgICAgcDEsIHAyLCAuLi4gLCBwbG9vcHZhbHVlICAgICAgICAgICAgICAgLQorCSgweDVhLCAgICAgICAnQU5EJywgICAgIDAsICAgICAgICAgICAgICdMb2dpY2FsQW5kJywgIDIsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMiwgZTEgICAgICAgICAgICAgICBiCisJKDB4MmIsICAgICAgJ0NBTEwnLCAgICAgMCwgICAgICAgICAgICdDYWxsRnVuY3Rpb24nLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAgICAgICAgICAgICAgIC0KKwkoMHg2NywgICAnQ0VJTElORycsICAgICAwLCAgICAgICAgICAgICAgICAnQ2VpbGluZycsICAxLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgY2VpbChuKQorCSgweDI1LCAgICAnQ0lOREVYJywgICAgIDAsICAgICAgICAnQ29weVhUb1RvcFN0YWNrJywgIDEsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgICAgICAgICAgICAgIGVrCisJKDB4MjIsICAgICAnQ0xFQVInLCAgICAgMCwgICAgICAgICAgICAgJ0NsZWFyU3RhY2snLCAtMSwgIDApLCAjICAgICAgICAgICAgICAgYWxsIGl0ZW1zIG9uIHRoZSBzdGFjayAgICAgICAgICAgICAgIC0KKwkoMHg0ZiwgICAgICdERUJVRycsICAgICAwLCAgICAgICAgICAgICAgJ0RlYnVnQ2FsbCcsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgICAgICAgLQorCSgweDczLCAgICdERUxUQUMxJywgICAgIDAsICAgICAgICdEZWx0YUV4Y2VwdGlvbkMxJywgLTEsICAwKSwgIyAgICBhcmduLCBjbiwgYXJnbi0xLGNuLTEsICwgYXJnMSwgYzEgICAgICAgICAgICAgICAtCisJKDB4NzQsICAgJ0RFTFRBQzInLCAgICAgMCwgICAgICAgJ0RlbHRhRXhjZXB0aW9uQzInLCAtMSwgIDApLCAjICAgIGFyZ24sIGNuLCBhcmduLTEsY24tMSwgLCBhcmcxLCBjMSAgICAgICAgICAgICAgIC0KKwkoMHg3NSwgICAnREVMVEFDMycsICAgICAwLCAgICAgICAnRGVsdGFFeGNlcHRpb25DMycsIC0xLCAgMCksICMgICAgYXJnbiwgY24sIGFyZ24tMSxjbi0xLCAsIGFyZzEsIGMxICAgICAgICAgICAgICAgLQorCSgweDVkLCAgICdERUxUQVAxJywgICAgIDAsICAgICAgICdEZWx0YUV4Y2VwdGlvblAxJywgLTEsICAwKSwgIyAgIGFyZ24sIHBuLCBhcmduLTEsIHBuLTEsICwgYXJnMSwgcDEgICAgICAgICAgICAgICAtCisJKDB4NzEsICAgJ0RFTFRBUDInLCAgICAgMCwgICAgICAgJ0RlbHRhRXhjZXB0aW9uUDInLCAtMSwgIDApLCAjICAgYXJnbiwgcG4sIGFyZ24tMSwgcG4tMSwgLCBhcmcxLCBwMSAgICAgICAgICAgICAgIC0KKwkoMHg3MiwgICAnREVMVEFQMycsICAgICAwLCAgICAgICAnRGVsdGFFeGNlcHRpb25QMycsIC0xLCAgMCksICMgICBhcmduLCBwbiwgYXJnbi0xLCBwbi0xLCAsIGFyZzEsIHAxICAgICAgICAgICAgICAgLQorCSgweDI0LCAgICAgJ0RFUFRIJywgICAgIDAsICAgICAgICAgICdHZXREZXB0aFN0YWNrJywgIDAsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICBuCisJKDB4NjIsICAgICAgICdESVYnLCAgICAgMCwgICAgICAgICAgICAgICAgICdEaXZpZGUnLCAgMiwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4yLCBuMSAgIChuMSAqIDY0KS8gbjIKKwkoMHgyMCwgICAgICAgJ0RVUCcsICAgICAwLCAgICAgICdEdXBsaWNhdGVUb3BTdGFjaycsICAxLCAgMiksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICAgICAgICAgICAgZSwgZQorCSgweDU5LCAgICAgICAnRUlGJywgICAgIDAsICAgICAgICAgICAgICAgICAgJ0VuZElmJywgIDAsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAtCisJKDB4MWIsICAgICAgJ0VMU0UnLCAgICAgMCwgICAgICAgICAgICAgICAgICAgJ0Vsc2UnLCAgMCwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgIC0KKwkoMHgyZCwgICAgICAnRU5ERicsICAgICAwLCAgJ0VuZEZ1bmN0aW9uRGVmaW5pdGlvbicsICAwLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgLQorCSgweDU0LCAgICAgICAgJ0VRJywgICAgIDAsICAgICAgICAgICAgICAgICAgJ0VxdWFsJywgIDIsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMiwgZTEgICAgICAgICAgICAgICBiCisJKDB4NTcsICAgICAgJ0VWRU4nLCAgICAgMCwgICAgICAgICAgICAgICAgICAgJ0V2ZW4nLCAgMSwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAgICAgICAgICAgICAgIGIKKwkoMHgyYywgICAgICAnRkRFRicsICAgICAwLCAgICAgJ0Z1bmN0aW9uRGVmaW5pdGlvbicsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICAgICAgICAgICAgICAgLQorCSgweDRlLCAgICdGTElQT0ZGJywgICAgIDAsICAgICAgICAgJ1NldEF1dG9GbGlwT2ZmJywgIDAsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAtCisJKDB4NGQsICAgICdGTElQT04nLCAgICAgMCwgICAgICAgICAgJ1NldEF1dG9GbGlwT24nLCAgMCwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgIC0KKwkoMHg4MCwgICAgJ0ZMSVBQVCcsICAgICAwLCAgICAgICAgICAgICAgJ0ZsaXBQb2ludCcsIC0xLCAgMCksICMgICAgICAgICAgICAgIHAxLCBwMiwgLi4uLCBwbG9vcHZhbHVlICAgICAgICAgICAgICAgLQorCSgweDgyLCAnRkxJUFJHT0ZGJywgICAgIDAsICAgICAgICAgICAnRmxpcFJhbmdlT2ZmJywgIDIsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsIGwgICAgICAgICAgICAgICAtCisJKDB4ODEsICAnRkxJUFJHT04nLCAgICAgMCwgICAgICAgICAgICAnRmxpcFJhbmdlT24nLCAgMiwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgbCAgICAgICAgICAgICAgIC0KKwkoMHg2NiwgICAgICdGTE9PUicsICAgICAwLCAgICAgICAgICAgICAgICAgICdGbG9vcicsICAxLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICBmbG9vcihuKQorCSgweDQ2LCAgICAgICAgJ0dDJywgICAgIDEsICAgICAgJ0dldENvb3JkT25QVmVjdG9yJywgIDEsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgICAgICAgICAgICAgICBjCisJKDB4ODgsICAgJ0dFVElORk8nLCAgICAgMCwgICAgICAgICAgICAgICAgJ0dldEluZm8nLCAgMSwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciAgICAgICAgICByZXN1bHQKKwkoMHgwZCwgICAgICAgJ0dGVicsICAgICAwLCAgICAgICAgICAgICAnR2V0RlZlY3RvcicsICAwLCAgMiksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgIHB4LCBweQorCSgweDBjLCAgICAgICAnR1BWJywgICAgIDAsICAgICAgICAgICAgICdHZXRQVmVjdG9yJywgIDAsICAyKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgcHgsIHB5CisJKDB4NTIsICAgICAgICAnR1QnLCAgICAgMCwgICAgICAgICAgICAnR3JlYXRlclRoYW4nLCAgMiwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUyLCBlMSAgICAgICAgICAgICAgIGIKKwkoMHg1MywgICAgICAnR1RFUScsICAgICAwLCAgICAgJ0dyZWF0ZXJUaGFuT3JFcXVhbCcsICAyLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIsIGUxICAgICAgICAgICAgICAgYgorCSgweDg5LCAgICAgICdJREVGJywgICAgIDAsICAnSW5zdHJ1Y3Rpb25EZWZpbml0aW9uJywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgICAgICAgICAgICAgICAtCisJKDB4NTgsICAgICAgICAnSUYnLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAnSWYnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAgICAgICAgICAgICAgIC0KKwkoMHg4ZSwgICdJTlNUQ1RSTCcsICAgICAwLCAgICAnU2V0SW5zdHJFeGVjQ29udHJvbCcsICAyLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCB2ICAgICAgICAgICAgICAgLQorCSgweDM5LCAgICAgICAgJ0lQJywgICAgIDAsICAgICAgICAgJ0ludGVycG9sYXRlUHRzJywgLTEsICAwKSwgIyAgICAgICAgICAgICBwMSwgcDIsIC4uLiAsIHBsb29wdmFsdWUgICAgICAgICAgICAgICAtCisJKDB4MGYsICAgICAnSVNFQ1QnLCAgICAgMCwgICAgICAnTW92ZVB0VG9JbnRlcnNlY3QnLCAgNSwgIDApLCAjICAgICAgICAgICAgICAgICAgICBhMSwgYTAsIGIxLCBiMCwgcCAgICAgICAgICAgICAgIC0KKwkoMHgzMCwgICAgICAgJ0lVUCcsICAgICAxLCAgICAgICdJbnRlcnBvbGF0ZVVudFB0cycsICAwLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgLQorCSgweDFjLCAgICAgICdKTVBSJywgICAgIDAsICAgICAgICAgICAgICAgICAgICdKdW1wJywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgICAgICAgICAgICAgICAtCisJKDB4NzksICAgICAgJ0pST0YnLCAgICAgMCwgICAgJ0p1bXBSZWxhdGl2ZU9uRmFsc2UnLCAgMiwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIG9mZnNldCAgICAgICAgICAgICAgIC0KKwkoMHg3OCwgICAgICAnSlJPVCcsICAgICAwLCAgICAgJ0p1bXBSZWxhdGl2ZU9uVHJ1ZScsICAyLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwgb2Zmc2V0ICAgICAgICAgICAgICAgLQorCSgweDJhLCAgJ0xPT1BDQUxMJywgICAgIDAsICAgICdMb29wQW5kQ2FsbEZ1bmN0aW9uJywgIDIsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgY291bnQgICAgICAgICAgICAgICAtCisJKDB4NTAsICAgICAgICAnTFQnLCAgICAgMCwgICAgICAgICAgICAgICAnTGVzc1RoYW4nLCAgMiwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUyLCBlMSAgICAgICAgICAgICAgIGIKKwkoMHg1MSwgICAgICAnTFRFUScsICAgICAwLCAgICAgICAgJ0xlc3NUaGVuT3JFcXVhbCcsICAyLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIsIGUxICAgICAgICAgICAgICAgYgorCSgweDhiLCAgICAgICAnTUFYJywgICAgIDAsICAgICAgICAgICAgICAgICdNYXhpbXVtJywgIDIsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMiwgZTEgICAgIG1heChlMSwgZTIpCisJKDB4NDksICAgICAgICAnTUQnLCAgICAgMSwgICAgICAgICdNZWFzdXJlRGlzdGFuY2UnLCAgMiwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMixwMSAgICAgICAgICAgICAgIGQKKwkoMHgyZSwgICAgICAnTURBUCcsICAgICAxLCAgICAgICAgJ01vdmVEaXJlY3RBYnNQdCcsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICAgICAgICAgICAgICAgLQorCSgweGMwLCAgICAgICdNRFJQJywgICAgIDUsICAgICAgICAnTW92ZURpcmVjdFJlbFB0JywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgICAgICAgICAgICAgICAtCisJKDB4M2UsICAgICAgJ01JQVAnLCAgICAgMSwgICAgICAnTW92ZUluZGlyZWN0QWJzUHQnLCAgMiwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiwgcCAgICAgICAgICAgICAgIC0KKwkoMHg4YywgICAgICAgJ01JTicsICAgICAwLCAgICAgICAgICAgICAgICAnTWluaW11bScsICAyLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIsIGUxICAgICBtaW4oZTEsIGUyKQorCSgweDI2LCAgICAnTUlOREVYJywgICAgIDAsICAgICAgICAnTW92ZVhUb1RvcFN0YWNrJywgIDIsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgICAgICAgICAgICAgIGVrCisJKDB4ZTAsICAgICAgJ01JUlAnLCAgICAgNSwgICAgICAnTW92ZUluZGlyZWN0UmVsUHQnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiwgcCAgICAgICAgICAgICAgIC0KKwkoMHg0YiwgICAgICdNUFBFTScsICAgICAwLCAgICAgICdNZWFzdXJlUGl4ZWxQZXJFbScsICAwLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgcHBlbQorCSgweDRjLCAgICAgICAnTVBTJywgICAgIDAsICAgICAgICdNZWFzdXJlUG9pbnRTaXplJywgIDAsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgcG9pbnRTaXplCisJKDB4M2EsICAgICAnTVNJUlAnLCAgICAgMSwgICAgJ01vdmVTdGFja0luZGlyUmVsUHQnLCAgMiwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCwgcCAgICAgICAgICAgICAgIC0KKwkoMHg2MywgICAgICAgJ01VTCcsICAgICAwLCAgICAgICAgICAgICAgICdNdWx0aXBseScsICAyLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjIsIG4xICAgIChuMSAqIG4yKS82NAorCSgweDY1LCAgICAgICAnTkVHJywgICAgIDAsICAgICAgICAgICAgICAgICAnTmVnYXRlJywgIDEsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gICAgICAgICAgICAgIC1uCisJKDB4NTUsICAgICAgICdORVEnLCAgICAgMCwgICAgICAgICAgICAgICAnTm90RXF1YWwnLCAgMiwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUyLCBlMSAgICAgICAgICAgICAgIGIKKwkoMHg1YywgICAgICAgJ05PVCcsICAgICAwLCAgICAgICAgICAgICAnTG9naWNhbE5vdCcsICAxLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICAgICAgICggbm90IGUgKQorCSgweDZjLCAgICAnTlJPVU5EJywgICAgIDIsICAgICAgICAgICAgICAgICdOb1JvdW5kJywgIDEsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjEgICAgICAgICAgICAgIG4yCisJKDB4NTYsICAgICAgICdPREQnLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICdPZGQnLCAgMSwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAgICAgICAgICAgICAgIGIKKwkoMHg1YiwgICAgICAgICdPUicsICAgICAwLCAgICAgICAgICAgICAgJ0xvZ2ljYWxPcicsICAyLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIsIGUxICAgICAgICAgICAgICAgYgorCSgweDIxLCAgICAgICAnUE9QJywgICAgIDAsICAgICAgICAgICAgJ1BvcFRvcFN0YWNrJywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgICAgICAgICAgICAgICAtCisJKDB4NDUsICAgICAgJ1JDVlQnLCAgICAgMCwgICAgICAgICAgICAgICAgJ1JlYWRDVlQnLCAgMSwgIDEpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiAgICAgICAgICAgdmFsdWUKKwkoMHg3ZCwgICAgICAnUkRURycsICAgICAwLCAgICAgICAgJ1JvdW5kRG93blRvR3JpZCcsICAwLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgLQorCSgweDdhLCAgICAgICdST0ZGJywgICAgIDAsICAgICAgICAgICAgICAgJ1JvdW5kT2ZmJywgIDAsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAtCisJKDB4OGEsICAgICAgJ1JPTEwnLCAgICAgMCwgICAgICAnUm9sbFRvcFRocmVlU3RhY2snLCAgMywgIDMpLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLGIsYyAgICAgICAgICAgYixhLGMKKwkoMHg2OCwgICAgICdST1VORCcsICAgICAyLCAgICAgICAgICAgICAgICAgICdSb3VuZCcsICAxLCAgMSksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4xICAgICAgICAgICAgICBuMgorCSgweDQzLCAgICAgICAgJ1JTJywgICAgIDAsICAgICAgICAgICAgICAnUmVhZFN0b3JlJywgIDEsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gICAgICAgICAgICAgICB2CisJKDB4M2QsICAgICAgJ1JUREcnLCAgICAgMCwgICAgICAnUm91bmRUb0RvdWJsZUdyaWQnLCAgMCwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgIC0KKwkoMHgxOCwgICAgICAgJ1JURycsICAgICAwLCAgICAgICAgICAgICdSb3VuZFRvR3JpZCcsICAwLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgLQorCSgweDE5LCAgICAgICdSVEhHJywgICAgIDAsICAgICAgICAnUm91bmRUb0hhbGZHcmlkJywgIDAsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAtCisJKDB4N2MsICAgICAgJ1JVVEcnLCAgICAgMCwgICAgICAgICAgJ1JvdW5kVXBUb0dyaWQnLCAgMCwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgIC0KKwkoMHg3NywgICdTNDVST1VORCcsICAgICAwLCAgICAnU3VwZXJSb3VuZDQ1RGVncmVlcycsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgICAgICAgLQorCSgweDdlLCAgICAgJ1NBTkdXJywgICAgIDAsICAgICAgICAgJ1NldEFuZ2xlV2VpZ2h0JywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgICAgICAgICAgICAgICAtCisJKDB4ODUsICAnU0NBTkNUUkwnLCAgICAgMCwgICdTY2FuQ29udmVyc2lvbkNvbnRyb2wnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAgICAgICAgICAgICAgIC0KKwkoMHg4ZCwgICdTQ0FOVFlQRScsICAgICAwLCAgICAgICAgICAgICAgICdTY2FuVHlwZScsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgICAgICAgLQorCSgweDQ4LCAgICAgICdTQ0ZTJywgICAgIDAsICAgICdTZXRDb29yZEZyb21TdGFja0ZQJywgIDIsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIHAgICAgICAgICAgICAgICAtCisJKDB4MWQsICAgICdTQ1ZUQ0knLCAgICAgMCwgICAgICAgICAgICAnU2V0Q1ZUQ3V0SW4nLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAgICAgICAgICAgICAgIC0KKwkoMHg1ZSwgICAgICAgJ1NEQicsICAgICAwLCAgICdTZXREZWx0YUJhc2VJbkdTdGF0ZScsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgICAgICAgLQorCSgweDg2LCAgICAnU0RQVlRMJywgICAgIDEsICAgJ1NldER1YWxQVmVjdG9yVG9MaW5lJywgIDIsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMiwgcDEgICAgICAgICAgICAgICAtCisJKDB4NWYsICAgICAgICdTRFMnLCAgICAgMCwgICdTZXREZWx0YVNoaWZ0SW5HU3RhdGUnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAgICAgICAgICAgICAgIC0KKwkoMHgwYiwgICAgICdTRlZGUycsICAgICAwLCAgICAnU2V0RlZlY3RvckZyb21TdGFjaycsICAyLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCB4ICAgICAgICAgICAgICAgLQorCSgweDA0LCAgICAnU0ZWVENBJywgICAgIDEsICAgICAgICdTZXRGVmVjdG9yVG9BeGlzJywgIDAsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gICAgICAgICAgICAgICAtCisJKDB4MDgsICAgICAnU0ZWVEwnLCAgICAgMSwgICAgICAgJ1NldEZWZWN0b3JUb0xpbmUnLCAgMiwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyLCBwMSAgICAgICAgICAgICAgIC0KKwkoMHgwZSwgICAgJ1NGVlRQVicsICAgICAwLCAgICAnU2V0RlZlY3RvclRvUFZlY3RvcicsICAwLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgLQorCSgweDM0LCAgICAgICAnU0hDJywgICAgIDEsICAgJ1NoaWZ0Q29udG91ckJ5TGFzdFB0JywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgICAgICAgICAgICAgICAtCisJKDB4MzIsICAgICAgICdTSFAnLCAgICAgMSwgICdTaGlmdFBvaW50QnlMYXN0UG9pbnQnLCAtMSwgIDApLCAjICAgICAgICAgICAgICBwMSwgcDIsIC4uLiwgcGxvb3B2YWx1ZSAgICAgICAgICAgICAgIC0KKwkoMHgzOCwgICAgICdTSFBJWCcsICAgICAwLCAgICAgICAnU2hpZnRab25lQnlQaXhlbCcsIC0xLCAgMCksICMgICAgICAgICAgIGQsIHAxLCBwMiwgLi4uLCBwbG9vcHZhbHVlICAgICAgICAgICAgICAgLQorCSgweDM2LCAgICAgICAnU0haJywgICAgIDEsICAgJ1NoaWZ0Wm9uZUJ5TGFzdFBvaW50JywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgICAgICAgICAgICAgICAtCisJKDB4MTcsICAgICAnU0xPT1AnLCAgICAgMCwgICAgICAgICdTZXRMb29wVmFyaWFibGUnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAgICAgICAgICAgICAgIC0KKwkoMHgxYSwgICAgICAgJ1NNRCcsICAgICAwLCAgICAgJ1NldE1pbmltdW1EaXN0YW5jZScsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICAgICAgICAgICAgICAgLQorCSgweDBhLCAgICAgJ1NQVkZTJywgICAgIDAsICAgICdTZXRQVmVjdG9yRnJvbVN0YWNrJywgIDIsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksIHggICAgICAgICAgICAgICAtCisJKDB4MDIsICAgICdTUFZUQ0EnLCAgICAgMSwgICAgICAgJ1NldFBWZWN0b3JUb0F4aXMnLCAgMCwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgIC0KKwkoMHgwNiwgICAgICdTUFZUTCcsICAgICAxLCAgICAgICAnU2V0UFZlY3RvclRvTGluZScsICAyLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDIsIHAxICAgICAgICAgICAgICAgLQorCSgweDc2LCAgICAnU1JPVU5EJywgICAgIDAsICAgICAgICAgICAgICdTdXBlclJvdW5kJywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gICAgICAgICAgICAgICAtCisJKDB4MTAsICAgICAgJ1NSUDAnLCAgICAgMCwgICAgICAgICAgICdTZXRSZWZQb2ludDAnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAgICAgICAgICAgICAgIC0KKwkoMHgxMSwgICAgICAnU1JQMScsICAgICAwLCAgICAgICAgICAgJ1NldFJlZlBvaW50MScsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICAgICAgICAgICAgICAgLQorCSgweDEyLCAgICAgICdTUlAyJywgICAgIDAsICAgICAgICAgICAnU2V0UmVmUG9pbnQyJywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgICAgICAgICAgICAgICAtCisJKDB4MWYsICAgICAgICdTU1cnLCAgICAgMCwgICAgICAgICAnU2V0U2luZ2xlV2lkdGgnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAgICAgICAgICAgICAgIC0KKwkoMHgxZSwgICAgICdTU1dDSScsICAgICAwLCAgICAnU2V0U2luZ2xlV2lkdGhDdXRJbicsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgICAgICAgLQorCSgweDYxLCAgICAgICAnU1VCJywgICAgIDAsICAgICAgICAgICAgICAgJ1N1YnRyYWN0JywgIDIsICAxKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMiwgbjEgICAgICAgKG4xIC0gbjIpCisJKDB4MDAsICAgICAnU1ZUQ0EnLCAgICAgMSwgICAgICAnU2V0RlBWZWN0b3JUb0F4aXMnLCAgMCwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgIC0KKwkoMHgyMywgICAgICAnU1dBUCcsICAgICAwLCAgICAgICAgICAgJ1N3YXBUb3BTdGFjaycsICAyLCAgMiksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTIsIGUxICAgICAgICAgIGUxLCBlMgorCSgweDEzLCAgICAgICdTWlAwJywgICAgIDAsICAgICAgICAnU2V0Wm9uZVBvaW50ZXIwJywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gICAgICAgICAgICAgICAtCisJKDB4MTQsICAgICAgJ1NaUDEnLCAgICAgMCwgICAgICAgICdTZXRab25lUG9pbnRlcjEnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAgICAgICAgICAgICAgIC0KKwkoMHgxNSwgICAgICAnU1pQMicsICAgICAwLCAgICAgICAgJ1NldFpvbmVQb2ludGVyMicsICAxLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICAgICAgICAgICAgICAgLQorCSgweDE2LCAgICAgICdTWlBTJywgICAgIDAsICAgICAgICAnU2V0Wm9uZVBvaW50ZXJTJywgIDEsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gICAgICAgICAgICAgICAtCisJKDB4MjksICAgICAgICdVVFAnLCAgICAgMCwgICAgICAgICAgICAgICdVblRvdWNoUHQnLCAgMSwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAgICAgICAgICAgICAgIC0KKwkoMHg3MCwgICAgICdXQ1ZURicsICAgICAwLCAgICAgICAnV3JpdGVDVlRJbkZVbml0cycsICAyLCAgMCksICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLCBsICAgICAgICAgICAgICAgLQorCSgweDQ0LCAgICAgJ1dDVlRQJywgICAgIDAsICAgICAgICdXcml0ZUNWVEluUGl4ZWxzJywgIDIsICAwKSwgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIGwgICAgICAgICAgICAgICAtCisJKDB4NDIsICAgICAgICAnV1MnLCAgICAgMCwgICAgICAgICAgICAgJ1dyaXRlU3RvcmUnLCAgMiwgIDApLCAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgbCAgICAgICAgICAgICAgIC0KKyMJLS0tLS0tICAtLS0tLS0tLS0tLSAgLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0gIC0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0KK10KKworCitkZWYgYml0UmVwcih2YWx1ZSwgYml0cyk6CisJcyA9ICIiCisJZm9yIGkgaW4gcmFuZ2UoYml0cyk6CisJCXMgPSAiMDEiW3ZhbHVlICYgMHgxXSArIHMKKwkJdmFsdWUgPSB2YWx1ZSA+PiAxCisJcmV0dXJuIHMKKworZGVmIG1ha2VPcGNvZGVEaWN0KGluc3RydWN0aW9uTGlzdCk6CisJb3Bjb2RlRGljdCA9IHt9CisJZm9yIG9wLCBtbmVtb25pYywgYXJnYml0cywgbmFtZSwgcG9wcywgcHVzaGVzIGluIGluc3RydWN0aW9uTGlzdDoKKwkJaWYgYXJnYml0czoKKwkJCWFyZ29mZnNldCA9IG9wCisJCQlmb3IgaSBpbiByYW5nZSgxIDw8IGFyZ2JpdHMpOgorCQkJCW9wY29kZURpY3Rbb3AraV0gPSBtbmVtb25pYywgYXJnYml0cywgYXJnb2Zmc2V0LCBuYW1lCisJCWVsc2U6CisJCQkJb3Bjb2RlRGljdFtvcF0gPSBtbmVtb25pYywgMCwgMCwgbmFtZQorCXJldHVybiBvcGNvZGVEaWN0CisKK3N0cmVhbU9wY29kZURpY3QgPSBtYWtlT3Bjb2RlRGljdChzdHJlYW1JbnN0cnVjdGlvbnMpCitvcGNvZGVEaWN0ID0gbWFrZU9wY29kZURpY3QoaW5zdHJ1Y3Rpb25zKQorCit0dF9pbnN0cnVjdGlvbnNfZXJyb3IgPSAiVFQgaW5zdHJ1Y3Rpb25zIGVycm9yIgorCisKK2NsYXNzIFByb2dyYW06CisJCisJZGVmIF9faW5pdF9fKHNlbGYpOgorCQlwYXNzCisJCisJZGVmIGZyb21CeXRlY29kZShzZWxmLCBieXRlY29kZSk6CisJCXNlbGYuYnl0ZWNvZGUgPSBhcnJheS5hcnJheSgiQiIpCisJCXNlbGYuYnl0ZWNvZGUuZnJvbXN0cmluZyhieXRlY29kZSkKKwkKKwlkZWYgZnJvbUFzc2VtYmx5KHNlbGYsIGFzc2VtYmx5KToKKwkJc2VsZi5hc3NlbWJseSA9IGFzc2VtYmx5CisJCisJZGVmIGdldEJ5dGVjb2RlKHNlbGYpOgorCQlpZiBub3QgaGFzYXR0cihzZWxmLCAiYnl0ZWNvZGUiKToKKwkJCXNlbGYuX2Fzc2VtYmxlKCkKKwkJcmV0dXJuIHNlbGYuYnl0ZWNvZGUudG9zdHJpbmcoKQorCQorCWRlZiBnZXRBc3NlbWJseShzZWxmKToKKwkJaWYgbm90IGhhc2F0dHIoc2VsZiwgImFzc2VtYmx5Iik6CisJCQlzZWxmLl9kaXNhc3NlbWJsZSgpCisJCXJldHVybiBzZWxmLmFzc2VtYmx5CisJCisJZGVmIF9hc3NlbWJsZShzZWxmKToKKwkJeHh4CisJCisJZGVmIF9kaXNhc3NlbWJsZShzZWxmKToKKwkJYXNzZW1ibHkgPSBbXQorCQlpID0gMAorCQlieXRlY29kZSA9IHNlbGYuYnl0ZWNvZGUKKwkJbnVtQnl0ZWNvZGUgPSBsZW4oYnl0ZWNvZGUpCisJCXdoaWxlIGkgPCBudW1CeXRlY29kZToKKwkJCW9wID0gYnl0ZWNvZGVbaV0KKwkJCWFyZyA9IDAKKwkJCXRyeToKKwkJCQltbmVtb25pYywgYXJnYml0cywgYXJnb2Zmc2V0LCBuYW1lID0gb3Bjb2RlRGljdFtvcF0KKwkJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCQl0cnk6CisJCQkJCW1uZW1vbmljLCBhcmdiaXRzLCBhcmdvZmZzZXQsIG5hbWUgPSBzdHJlYW1PcGNvZGVEaWN0W29wXQorCQkJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCQkJcmFpc2UgdHRfaW5zdHJ1Y3Rpb25zX2Vycm9yLCAiaWxsZWdhbCBvcGNvZGU6IDB4JS4yeCIgJSBvcAorCQkJCXB1c2hieXRlcyA9IHB1c2h3b3JkcyA9IDAKKwkJCQlpZiBhcmdiaXRzOgorCQkJCQlpZiBtbmVtb25pYyA9PSAiUFVTSEIiOgorCQkJCQkJcHVzaGJ5dGVzID0gb3AgLSBhcmdvZmZzZXQgKyAxCisJCQkJCWVsc2U6CisJCQkJCQlwdXNod29yZHMgPSBvcCAtIGFyZ29mZnNldCArIDEKKwkJCQllbHNlOgorCQkJCQlpID0gaSArIDEKKwkJCQkJaWYgbW5lbW9uaWMgPT0gIk5QVVNIQiI6CisJCQkJCQlwdXNoYnl0ZXMgPSBieXRlY29kZVtpXQorCQkJCQllbHNlOgorCQkJCQkJcHVzaHdvcmRzID0gYnl0ZWNvZGVbaV0KKwkJCQlpID0gaSArIDEKKwkJCQlhc3NlbWJseS5hcHBlbmQobW5lbW9uaWMgKyAiWyBdIikKKwkJCQlmb3IgaiBpbiByYW5nZShwdXNoYnl0ZXMpOgorCQkJCQlhc3NlbWJseS5hcHBlbmQoYGJ5dGVjb2RlW2ldYCkKKwkJCQkJaSA9IGkgKyAxCisJCQkJZm9yIGogaW4gcmFuZ2UoMCwgcHVzaHdvcmRzLCAyKToKKwkJCQkJYXNzZW1ibHkuYXBwZW5kKGAoYnl0ZWNvZGVbaV0gPDwgOCkgKyBieXRlY29kZVtpKzFdYCkKKwkJCQkJaSA9IGkgKyAyCisJCQllbHNlOgorCQkJCWlmIGFyZ2JpdHM6CisJCQkJCWFzc2VtYmx5LmFwcGVuZChtbmVtb25pYyArICJbJXNdIiAlIGJpdFJlcHIob3AgLSBhcmdvZmZzZXQsIGFyZ2JpdHMpKQorCQkJCWVsc2U6CisJCQkJCWFzc2VtYmx5LmFwcGVuZChtbmVtb25pYyArICJbIF0iKQorCQkJCWkgPSBpICsgMQorCQlzZWxmLmFzc2VtYmx5ID0gYXNzZW1ibHkKKwkJZGVsIHNlbGYuYnl0ZWNvZGUKKworCitmcGdtID0gJ0BcMDE0NzYmJVwwMzdcMDIzXDAyMlwwMTVcMDE0XDAwNVwwMDRcMDAyLCBcMjYwXDAwMyVFI0UjYWhcMjEyIEVoIFwyMTIjRGBELSxLUlhFRFwwMzMhIVktLCAgRWhEIFwyNjBcMDAxYCBFXDI2MEZ2aFwwMzBcMjEyRWBELSxcMjYwXDAyMitcMjYwXDAwMiVFXDI2MFwwMDIlRWpcMjYwQFwyMTNgXDI2MFwwMDIlI0QhISEtLFwyNjBcMDIzK1wyNjBcMDAyJUVcMjYwXDAwMiVFalwyNzBcMzc3XDMwMFwyMTRgXDI2MFwwMDIlI0QhISEtLFwyNjFcMDAwXDAwMyVFaFRYXDI2MFwwMDMlRVwyNjBcMDAzJUVgaCBcMjYwXDAwNCUjRFwyNjBcMDA0JSNEXDAzM1wyNjBcMDAzJSBFaCBcMjEyI0RcMjYwXDAwMyVFaGBcMjYwXDAwMyUjRFktLFwyNjBcMDAzJSBFaCBcMjEyI0RcMjYwXDAwMyVFaGBcMjYwXDAwMyUjRC0sS1JYRURcMDMzISFZLSxGI0ZgXDIxMlwyMTJGIyBGXDIxMmBcMjEyYVwyNzBcMzc3XDIwMGIjIFwwMjAjXDIxMlwyNjFLS1wyMTJwRWAgXDI2MFwwMDBQWFwyNjBcMDAxYVwyNzBcMzc3XDI3MlwyMTNcMDMzXDI2MEZcMjE0WVwyNjBcMDIwYGhcMDAxOi0sIEVcMjYwXDAwMyVGUlg/XDAzMyFcMDIxWS0sS1MjS1FaWCBFXDIxMmBEXDAzMyEhWS0sS1MjS1FaWDhcMDMzISFZLScKK2dwZ20gPSAnQFwwMjJcMDExXDAwM1wyMDdAXDAwNVwyMDBcMDA0XDIwN1wwMDBcMDEwXDAwN1wyMDJcMDAxXDAxMFwwMDRcMjAyXDAwMFwwMTBcMDAwXDAyMFwzMjBcMzU1XDAyMFwzMzZcMzU1XDAwMVwwMjBcMzM2XDM3NVwwMzJ9XDMzNlwwMzJcMDMwXDM3NVwzMTYxMCcKKworcCA9IFByb2dyYW0oKQorcC5mcm9tQnl0ZWNvZGUoZnBnbSkKK2ZvciBsaW5lIGluIHAuZ2V0QXNzZW1ibHkoKToKKwlwcmludCBsaW5lCisKZGlmZiAtLWdpdCBhL0xpYi9mb250VG9vbHMvdHRMaWIvdGVzdC90dEJyb3dzZXIucHkgYi9MaWIvZm9udFRvb2xzL3R0TGliL3Rlc3QvdHRCcm93c2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTQzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3Rlc3QvdHRCcm93c2VyLnB5CkBAIC0wLDAgKzEsMzMyIEBACitmcm9tIGZvbnRUb29scyBpbXBvcnQgdHRMaWIKK2Zyb20gZm9udFRvb2xzLnR0TGliIGltcG9ydCBtYWNVdGlscworaW1wb3J0IG1hY2ZzCitpbXBvcnQgUHlCcm93c2VyCitpbXBvcnQgVywgTGlzdHMKK2ltcG9ydCBvcworaW1wb3J0IEFUTQoraW1wb3J0IE51bWVyaWMKK2ltcG9ydCBRZAorZnJvbSByZi52aWV3cy53R2x5cGhMaXN0IGltcG9ydCBHbHlwaExpc3QKKworCitjbGFzcyBUYWJsZUJyb3dzZXI6CisJCisJZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSwgdHRGb250PU5vbmUsIHJlc19pbmRleD1Ob25lKToKKwkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKKwkJaWYgcGF0aCBpcyBOb25lOgorCQkJc2VsZi50dEZvbnQgPSB0dEZvbnQKKwkJCXNlbGYuZmlsZW5hbWUgPSAiPz8/PyIKKwkJZWxzZToKKwkJCXNlbGYudHRGb250ID0gdHRMaWIuVFRGb250KHBhdGgsIHJlc19pbmRleCkKKwkJCWlmIHJlc19pbmRleCBpcyBOb25lOgorCQkJCXNlbGYuZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCisJCQllbHNlOgorCQkJCXNlbGYuZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpICsgIiAtICIgKyBzdHIocmVzX2luZGV4KQorCQlzZWxmLmN1cnJlbnRnbHlwaCA9IE5vbmUKKwkJc2VsZi5nbHlwaHMgPSB7fQorCQlzZWxmLmJ1aWxkaW50ZXJmYWNlKCkKKwkKKwlkZWYgYnVpbGRpbnRlcmZhY2Uoc2VsZik6CisJCWJ1dHRvbndpZHRoID0gMTIwCisJCWdseXBobGlzdHdpZHRoID0gMTUwCisJCWhtYXJnaW4gPSAxMAorCQl2bWFyZ2luID0gOAorCQl0aXRsZSA9IHNlbGYuZmlsZW5hbWUKKwkJdGFibGVzID0gc2VsZi50dEZvbnQua2V5cygpCisJCXRhYmxlcy5zb3J0KCkKKwkJc2VsZi53ID0gdyA9IFcuV2luZG93KCg1MDAsIDMwMCksIHRpdGxlLCBtaW5zaXplID0gKDQwMCwgMjAwKSkKKwkJdy5icm93c2V0YWJsZWJ1dHRvbiA9IFcuQnV0dG9uKChobWFyZ2luLCAzMiwgYnV0dG9ud2lkdGgsIDE2KSwgIkJyb3dzZSB0YWJsZYoiLCAKKwkJCQlzZWxmLmJyb3dzZXRhYmxlKQorCQl3LmJyb3dzZWZvbnRidXR0b24gPSBXLkJ1dHRvbigoaG1hcmdpbiwgdm1hcmdpbiwgYnV0dG9ud2lkdGgsIDE2KSwgIkJyb3dzZSBmb250iiIsIAorCQkJCXNlbGYuYnJvd3NlZm9udCkKKwkJdy50YWJsZWxpc3QgPSBXLkxpc3QoKGhtYXJnaW4sIDU2LCBidXR0b253aWR0aCwgLTEyOCksIHRhYmxlcywgc2VsZi50YWJsZWxpc3RoaXQpCisJCQorCQl3LmRpdmxpbmUxID0gVy5WZXJ0aWNhbExpbmUoKGJ1dHRvbndpZHRoICsgMiAqIGhtYXJnaW4sIHZtYXJnaW4sIDEsIC12bWFyZ2luKSkKKwkJCisJCWdsZWZ0ID0gYnV0dG9ud2lkdGggKyAzICogaG1hcmdpbiArIDEKKwkJCisJCWhhc0dseWZUYWJsZSA9IHNlbGYudHRGb250Lmhhc19rZXkoJ2dseWYnKQorCQkKKwkJZ2x5cGhuYW1lcyA9IHNlbGYudHRGb250LmdldEdseXBoTmFtZXMyKCkgICMgY2FzZWxlc3NseSBzb3J0ZWQgZ2x5cGggbmFtZXMKKwkJCisJCWlmIGhhc0dseWZUYWJsZToKKwkJCXcuZ2x5cGhsaXN0ID0gR2x5cGhMaXN0KChnbGVmdCwgNTYsIGdseXBobGlzdHdpZHRoLCAtdm1hcmdpbiksIAorCQkJCQlnbHlwaG5hbWVzLCBzZWxmLmdseXBobGlzdGhpdCkKKwkJCQorCQkJdy5kaXZsaW5lMiA9IFcuVmVydGljYWxMaW5lKChidXR0b253aWR0aCArIGdseXBobGlzdHdpZHRoICsgNCAqIGhtYXJnaW4gKyAyLCAKKwkJCQkJdm1hcmdpbiwgMSwgLXZtYXJnaW4pKQorCQkJCisJCQl5TWluID0gc2VsZi50dEZvbnRbJ2hlYWQnXS55TWluCisJCQl5TWF4ID0gc2VsZi50dEZvbnRbJ2hlYWQnXS55TWF4CisJCQl3Lmd2aWV3ZXIgPSBHbHlwaFZpZXdlcigoYnV0dG9ud2lkdGggKyBnbHlwaGxpc3R3aWR0aCArIDUgKiBobWFyZ2luICsgMywgCisJCQkJCXZtYXJnaW4sIC1obWFyZ2luLCAtdm1hcmdpbiksIHlNaW4sIHlNYXgpCisJCQkKKwkJCXcuc2hvd3BvaW50cyA9IFcuQ2hlY2tCb3goKGdsZWZ0LCB2bWFyZ2luLCBnbHlwaGxpc3R3aWR0aCwgMTYpLCAiU2hvdyBwb2ludHMiLCAKKwkJCQkJc2VsZi53Lmd2aWV3ZXIudG9nZ2xlc2hvd3BvaW50cykKKwkJCXcuc2hvd3BvaW50cy5zZXQoc2VsZi53Lmd2aWV3ZXIuc2hvd3BvaW50cykKKwkJCXcuc2hvd2xpbmVzID0gVy5DaGVja0JveCgoZ2xlZnQsIHZtYXJnaW4gKyAyNCwgZ2x5cGhsaXN0d2lkdGgsIDE2KSwgIlNob3cgbGluZXMiLAorCQkJCQlzZWxmLncuZ3ZpZXdlci50b2dnbGVzaG93bGluZXMpCisJCQl3LnNob3dsaW5lcy5zZXQoc2VsZi53Lmd2aWV3ZXIuc2hvd2xpbmVzKQorCQllbHNlOgorCQkJdy5nbHlwaGxpc3QgPSBHbHlwaExpc3QoKGdsZWZ0LCA1NiwgZ2x5cGhsaXN0d2lkdGgsIC12bWFyZ2luKSwgCisJCQkJCWdseXBobmFtZXMpCisJCQl3Lm5vR2x5cGhUYWJsZSA9IFcuVGV4dEJveCgoZ2xlZnQsIHZtYXJnaW4sIC0yMCwgMjApLCAibm8gJ2dseWYnIHRhYmxlIGZvdW5kIikKKwkJCisJCQorCQl3LnNldGRlZmF1bHRidXR0b24ody5icm93c2V0YWJsZWJ1dHRvbikKKwkJCisJCXcudG9jdXJyZW50Zm9udCA9IFcuQnV0dG9uKChobWFyZ2luLCAtMTIwLCBidXR0b253aWR0aCwgMTYpLCAiQ29weSB0byBjdXJyZW50IGZvbnQiLCBzZWxmLmNvcHl0b2N1cnJlbnRmb250KQorCQl3LmZyb21jdXJyZW50Zm9udCA9IFcuQnV0dG9uKChobWFyZ2luLCAtOTYsIGJ1dHRvbndpZHRoLCAxNiksICJDb3B5IGZyb20gY3VycmVudCBmb250Iiwgc2VsZi5jb3B5ZnJvbWN1cnJlbnRmb250KQorCQl3LnNhdmVmbGF0ID0gVy5CdXR0b24oKGhtYXJnaW4sIC03MiwgYnV0dG9ud2lkdGgsIDE2KSwgIlNhdmUgYXMgZmxhdCBmaWxliiIsIHNlbGYuc2F2ZWZsYXQpCisJCXcuc2F2ZXN1aXRjYXNlYnV0dG9uID0gVy5CdXR0b24oKGhtYXJnaW4sIC00OCwgYnV0dG9ud2lkdGgsIDE2KSwgIlNhdmUgYXMgc3VpdGNhc2WKIiwgc2VsZi5zYXZlc3VpdGNhc2UpCisJCXcuc2F2ZXhtbGJ1dHRvbiA9IFcuQnV0dG9uKChobWFyZ2luLCAtMjQsIGJ1dHRvbndpZHRoLCAxNiksICJTYXZlIGFzIFhNTIoiLCBzZWxmLnNhdmVYTUwpCisJCQorCQl3Lm9wZW4oKQorCQl3LmJyb3dzZXRhYmxlYnV0dG9uLmVuYWJsZSgwKQorCQorCWRlZiBicm93c2V0YWJsZShzZWxmKToKKwkJc2VsZi50YWJsZWxpc3RoaXQoMSkKKwkKKwlkZWYgYnJvd3NlZm9udChzZWxmKToKKwkJUHlCcm93c2VyLkJyb3dzZXIoc2VsZi50dEZvbnQpCisJCisJZGVmIGNvcHl0b2N1cnJlbnRmb250KHNlbGYpOgorCQlwYXNzCisJCQorCWRlZiBjb3B5ZnJvbWN1cnJlbnRmb250KHNlbGYpOgorCQlwYXNzCisJCQorCWRlZiBzYXZlZmxhdChzZWxmKToKKwkJcGF0aCA9IHB1dGZpbGUoIlNhdmUgZm9udCBhcyBmbGF0IGZpbGU6Iiwgc2VsZi5maWxlbmFtZSwgIi5UVEYiKQorCQlpZiBwYXRoOgorCQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKKwkJCXNlbGYudHRGb250LnNhdmUocGF0aCkKKwkKKwlkZWYgc2F2ZXN1aXRjYXNlKHNlbGYpOgorCQlwYXRoID0gcHV0ZmlsZSgiU2F2ZSBmb250IGFzIHN1aXRjYXNlOiIsIHNlbGYuZmlsZW5hbWUsICIuc3VpdCIpCisJCWlmIHBhdGg6CisJCQlXLlNldEN1cnNvcignd2F0Y2gnKQorCQkJc2VsZi50dEZvbnQuc2F2ZShwYXRoLCAxKQorCQorCWRlZiBzYXZlWE1MKHNlbGYpOgorCQlwYXRoID0gcHV0ZmlsZSgiU2F2ZSBmb250IGFzIFhNTCB0ZXh0IGZpbGU6Iiwgc2VsZi5maWxlbmFtZSwgIi54bWwiKQorCQlpZiBwYXRoOgorCQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKKwkJCXBiID0gbWFjVXRpbHMuUHJvZ3Jlc3NCYXIoIlNhdmluZyAlcyBhcyBYTUyKIiAlIHNlbGYuZmlsZW5hbWUpCisJCQl0cnk6CisJCQkJc2VsZi50dEZvbnQuc2F2ZVhNTChwYXRoLCBwYikKKwkJCWZpbmFsbHk6CisJCQkJcGIuY2xvc2UoKQorCQorCWRlZiBnbHlwaGxpc3RoaXQoc2VsZiwgaXNEYmwpOgorCQlzZWwgPSBzZWxmLncuZ2x5cGhsaXN0LmdldHNlbGVjdGVkb2JqZWN0cygpCisJCWlmIG5vdCBzZWwgb3Igc2VsWzBdID09IHNlbGYuY3VycmVudGdseXBoOgorCQkJcmV0dXJuCisJCXNlbGYuY3VycmVudGdseXBoID0gc2VsWzBdCisJCWlmIHNlbGYuZ2x5cGhzLmhhc19rZXkoc2VsZi5jdXJyZW50Z2x5cGgpOgorCQkJZyA9IHNlbGYuZ2x5cGhzW3NlbGYuY3VycmVudGdseXBoXQorCQllbHNlOgorCQkJZyA9IEdseXBoKHNlbGYudHRGb250LCBzZWxmLmN1cnJlbnRnbHlwaCkKKwkJCXNlbGYuZ2x5cGhzW3NlbGYuY3VycmVudGdseXBoXSA9IGcKKwkJc2VsZi53Lmd2aWV3ZXIuc2V0Z2x5cGgoZykKKwkKKwlkZWYgdGFibGVsaXN0aGl0KHNlbGYsIGlzZGJsKToKKwkJaWYgaXNkYmw6CisJCQlmb3IgdGFnIGluIHNlbGYudy50YWJsZWxpc3QuZ2V0c2VsZWN0ZWRvYmplY3RzKCk6CisJCQkJdGFibGUgPSBzZWxmLnR0Rm9udFt0YWddCisJCQkJaWYgdGFnID09ICdnbHlmJzoKKwkJCQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKKwkJCQkJZm9yIGdseXBobmFtZSBpbiBzZWxmLnR0Rm9udC5nZXRHbHlwaE9yZGVyKCk6CisJCQkJCQl0cnk6CisJCQkJCQkJZ2x5cGggPSB0YWJsZVtnbHlwaG5hbWVdCisJCQkJCQlleGNlcHQgS2V5RXJyb3I6CisJCQkJCQkJcGFzcyAjIGluY29tcGxldGUgZm9udCwgb2ggd2VsbC4KKwkJCQlQeUJyb3dzZXIuQnJvd3Nlcih0YWJsZSkKKwkJZWxzZToKKwkJCXNlbCA9IHNlbGYudy50YWJsZWxpc3QuZ2V0c2VsZWN0aW9uKCkKKwkJCWlmIHNlbDoKKwkJCQlzZWxmLncuYnJvd3NldGFibGVidXR0b24uZW5hYmxlKDEpCisJCQllbHNlOgorCQkJCXNlbGYudy5icm93c2V0YWJsZWJ1dHRvbi5lbmFibGUoMCkKKworCitjbGFzcyBHbHlwaDoKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgdHRGb250LCBnbHlwaE5hbWUpOgorCQl0dGdseXBoID0gdHRGb250WydnbHlmJ11bZ2x5cGhOYW1lXQorCQlzZWxmLmlzY29tcG9zaXRlID0gdHRnbHlwaC5udW1iZXJPZkNvbnRvdXJzID09IC0xCisJCXNlbGYud2lkdGgsIHNlbGYubHNiID0gdHRGb250WydobXR4J11bZ2x5cGhOYW1lXQorCQlpZiB0dGdseXBoLm51bWJlck9mQ29udG91cnMgPT0gMDoKKwkJCXNlbGYueE1pbiA9IDAKKwkJCXNlbGYuY29udG91cnMgPSBbXQorCQkJcmV0dXJuCisJCXNlbGYueE1pbiA9IHR0Z2x5cGgueE1pbgorCQljb29yZGluYXRlcywgZW5kUHRzLCBmbGFncyA9IHR0Z2x5cGguZ2V0Q29vcmRpbmF0ZXModHRGb250WydnbHlmJ10pCisJCXNlbGYuY29udG91cnMgPSBbXQorCQlzZWxmLmZsYWdzID0gW10KKwkJc3RhcnRwdCA9IDAKKwkJZm9yIGVuZHB0IGluIGVuZFB0czoKKwkJCXNlbGYuY29udG91cnMuYXBwZW5kKE51bWVyaWMuYXJyYXkoY29vcmRpbmF0ZXNbc3RhcnRwdDplbmRwdCsxXSkpCisJCQlzZWxmLmZsYWdzLmFwcGVuZChmbGFnc1tzdGFydHB0OmVuZHB0KzFdKQorCQkJc3RhcnRwdCA9IGVuZHB0ICsgMQorCQorCWRlZiBnZXRjb250b3VycyhzZWxmLCBzY2FsZSwgbW92ZSk6CisJCWNvbnRvdXJzID0gW10KKwkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udG91cnMpKToKKwkJCWNvbnRvdXJzLmFwcGVuZCgoc2VsZi5jb250b3Vyc1tpXSAqIE51bWVyaWMuYXJyYXkoc2NhbGUpICsgbW92ZSksIHNlbGYuZmxhZ3NbaV0pCisJCXJldHVybiBjb250b3VycworCisKK2NsYXNzIEdseXBoVmlld2VyKFcuV2lkZ2V0KToKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgeU1pbiwgeU1heCk6CisJCVcuV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisJCXNlbGYuZ2x5cGggPSBOb25lCisJCWV4dHJhID0gMC4wMiAqICh5TWF4LXlNaW4pCisJCXNlbGYueU1pbiwgc2VsZi55TWF4ID0geU1pbiAtIGV4dHJhLCB5TWF4ICsgZXh0cmEKKwkJc2VsZi5zaG93cG9pbnRzID0gMQorCQlzZWxmLnNob3dsaW5lcyA9IDEKKwkKKwlkZWYgdG9nZ2xlc2hvd3BvaW50cyhzZWxmLCBvbm9mZik6CisJCXNlbGYuc2hvd3BvaW50cyA9IG9ub2ZmCisJCXNlbGYuU2V0UG9ydCgpCisJCXNlbGYuZHJhdygpCisJCisJZGVmIHRvZ2dsZXNob3dsaW5lcyhzZWxmLCBvbm9mZik6CisJCXNlbGYuc2hvd2xpbmVzID0gb25vZmYKKwkJc2VsZi5TZXRQb3J0KCkKKwkJc2VsZi5kcmF3KCkKKwkKKwlkZWYgc2V0Z2x5cGgoc2VsZiwgZ2x5cGgpOgorCQlzZWxmLmdseXBoID0gZ2x5cGgKKwkJc2VsZi5TZXRQb3J0KCkKKwkJc2VsZi5kcmF3KCkKKwkJCisJZGVmIGRyYXcoc2VsZiwgdmlzUmduPU5vbmUpOgorCQkjIFRoaXMgYSBIRUxMIG9mIGEgcm91dGluZSwgYnV0IGl0J3MgcHJldHR5IGRhbW4gZmFzdC4uLgorCQlpbXBvcnQgUWQKKwkJaWYgbm90IHNlbGYuX3Zpc2libGU6CisJCQlyZXR1cm4KKwkJUWQuRXJhc2VSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpKQorCQljbGlwcmduID0gUWQuTmV3UmduKCkKKwkJc2F2ZXJnbiA9IFFkLk5ld1JnbigpCisJCVFkLlJlY3RSZ24oY2xpcHJnbiwgc2VsZi5fYm91bmRzKQorCQlRZC5HZXRDbGlwKHNhdmVyZ24pCisJCVFkLlNldENsaXAoY2xpcHJnbikKKwkJdHJ5OgorCQkJaWYgc2VsZi5nbHlwaDoKKwkJCQlsLCB0LCByLCBiID0gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSkKKwkJCQloZWlnaHQgPSBiIC0gdAorCQkJCXNjYWxlID0gZmxvYXQoaGVpZ2h0KSAvIChzZWxmLnlNYXggLSBzZWxmLnlNaW4pCisJCQkJdG9wb2Zmc2V0ID0gdCArIHNjYWxlICogc2VsZi55TWF4CisJCQkJd2lkdGggPSBzY2FsZSAqIHNlbGYuZ2x5cGgud2lkdGgKKwkJCQlsc2IgPSBzY2FsZSAqIHNlbGYuZ2x5cGgubHNiCisJCQkJeE1pbiA9IHNjYWxlICogc2VsZi5nbHlwaC54TWluCisJCQkJIyBYWFhYIHRoaXMgaXMgbm90IGNvcnJlY3Qgd2hlbiBVU0VfTVlfTUVUUklDUyBpcyBzZXQgaW4gY29tcG9uZW50IQorCQkJCWxlZnRvZmZzZXQgPSBsICsgMC41ICogKHIgLSBsIC0gd2lkdGgpCisJCQkJZ2xlZnRvZmZzZXQgPSBsZWZ0b2Zmc2V0IC0geE1pbiArIGxzYgorCQkJCWlmIHNlbGYuc2hvd2xpbmVzOgorCQkJCQlRZC5SR0JGb3JlQ29sb3IoKDB4YWZmZiwgMHhhZmZmLCAweGFmZmYpKQorCQkJCQkjIGxlZnQgc2lkZWJlYXJpbmcKKwkJCQkJUWQuTW92ZVRvKGxlZnRvZmZzZXQsIHQpCisJCQkJCVFkLkxpbmVUbyhsZWZ0b2Zmc2V0LCBiIC0gMSkKKwkJCQkJIyByaWdodCBzaWRlYmVhcmluZworCQkJCQlRZC5Nb3ZlVG8obGVmdG9mZnNldCArIHdpZHRoLCB0KQorCQkJCQlRZC5MaW5lVG8obGVmdG9mZnNldCArIHdpZHRoLCBiIC0gMSkKKwkJCQkJIyBiYXNlbGluZQorCQkJCQlRZC5Nb3ZlVG8obCwgdG9wb2Zmc2V0KQorCQkJCQlRZC5MaW5lVG8ociAtIDEsIHRvcG9mZnNldCkKKwkJCQkJCisJCQkJCSMgb3JpZ2luCisJCQkJCVFkLlJHQkZvcmVDb2xvcigoMHg1ZmZmLCAwLCAwKSkKKwkJCQkJUWQuTW92ZVRvKGdsZWZ0b2Zmc2V0LCB0b3BvZmZzZXQgLSAxNikKKwkJCQkJUWQuTGluZVRvKGdsZWZ0b2Zmc2V0LCB0b3BvZmZzZXQgKyAxNikKKwkJCQkJIyByZXNldCBjb2xvcgorCQkJCQlRZC5SR0JGb3JlQ29sb3IoKDAsIDAsIDApKQorCQkJCQorCQkJCWlmIHNlbGYuZ2x5cGguaXNjb21wb3NpdGU6CisJCQkJCVFkLlJHQkZvcmVDb2xvcigoMHg3ZmZmLCAweDdmZmYsIDB4N2ZmZikpCisJCQkJCisJCQkJQVRNLnN0YXJ0RmlsbEFUTSgpCisJCQkJY29udG91cnMgPSBzZWxmLmdseXBoLmdldGNvbnRvdXJzKChzY2FsZSwgLXNjYWxlKSwgKGdsZWZ0b2Zmc2V0LCB0b3BvZmZzZXQpKQorCQkJCWZvciBjb250b3VyLCBmbGFncyBpbiBjb250b3VyczoKKwkJCQkJY3VycmVudHBvaW50ID0gTm9uZQorCQkJCQlkb25lX21vdmV0byA9IDAKKwkJCQkJaSA9IDAKKwkJCQkJblBvaW50cyA9IGxlbihjb250b3VyKQorCQkJCQl3aGlsZSBpIDwgblBvaW50czoKKwkJCQkJCXB0ID0gY29udG91cltpXQorCQkJCQkJaWYgZmxhZ3NbaV06CisJCQkJCQkJIyBvbkN1cnZlCisJCQkJCQkJY3VycmVudHBvaW50ID0gbGluZXRvKHB0LCBkb25lX21vdmV0bykKKwkJCQkJCWVsc2U6CisJCQkJCQkJaWYgbm90IGN1cnJlbnRwb2ludDoKKwkJCQkJCQkJaWYgbm90IGZsYWdzW2ktMV06CisJCQkJCQkJCQljdXJyZW50cG9pbnQgPSAwLjUgKiAoY29udG91cltpLTFdICsgcHQpCisJCQkJCQkJCWVsc2U6CisJCQkJCQkJCQljdXJyZW50cG9pbnQgPSBjb250b3VyW2ktMV0KKwkJCQkJCQlpZiBub3QgZmxhZ3NbKGkrMSkgJSBuUG9pbnRzXToKKwkJCQkJCQkJZW5kUHQgPSAwLjUgKiAocHQgKyBjb250b3VyWyhpKzEpICUgblBvaW50c10pCisJCQkJCQkJZWxzZToKKwkJCQkJCQkJZW5kUHQgPSBjb250b3VyWyhpKzEpICUgblBvaW50c10KKwkJCQkJCQkJaSA9IGkgKyAxCisJCQkJCQkJIyBvZmZDdXJ2ZQorCQkJCQkJCWN1cnJlbnRwb2ludCA9IHFjdXJ2ZXRvKGN1cnJlbnRwb2ludCwgCisJCQkJCQkJCQlwdCwgZW5kUHQsIGRvbmVfbW92ZXRvKQorCQkJCQkJZG9uZV9tb3ZldG8gPSAxCisJCQkJCQlpID0gaSArIDEKKwkJCQkJQVRNLmZpbGxDbG9zZVBhdGhBVE0oKQorCQkJCUFUTS5lbmRGaWxsQVRNKCkKKwkJCQkjIGRyYXcgcG9pbnQgbWFya2VycworCQkJCWlmIHNlbGYuc2hvd3BvaW50czoKKwkJCQkJZm9yIGNvbnRvdXIsIGZsYWdzIGluIGNvbnRvdXJzOgorCQkJCQkJUWQuUkdCRm9yZUNvbG9yKCgwLCAweGZmZmYsIDApKQorCQkJCQkJZm9yIGkgaW4gcmFuZ2UobGVuKGNvbnRvdXIpKToKKwkJCQkJCQkoeCwgeSkgPSBjb250b3VyW2ldCisJCQkJCQkJb25DdXJ2ZSA9IGZsYWdzW2ldICYgMHgxCisJCQkJCQkJaWYgb25DdXJ2ZToKKwkJCQkJCQkJUWQuUGFpbnRSZWN0KFFkLkluc2V0UmVjdCgoeCwgeSwgeCwgeSksIC0yLCAtMikpCisJCQkJCQkJZWxzZToKKwkJCQkJCQkJUWQuUGFpbnRPdmFsKFFkLkluc2V0UmVjdCgoeCwgeSwgeCwgeSksIC0yLCAtMikpCisJCQkJCQkJUWQuUkdCRm9yZUNvbG9yKCgweGZmZmYsIDAsIDApKQorCQkJCQkJUWQuUkdCRm9yZUNvbG9yKCgwLCAwLCAwKSkKKwkJCVFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCisJCWZpbmFsbHk6CisJCQlRZC5TZXRDbGlwKHNhdmVyZ24pCisJCQlRZC5EaXNwb3NlUmduKGNsaXByZ24pCisJCQlRZC5EaXNwb3NlUmduKHNhdmVyZ24pCisKKworZXh0ZW5zaW9ucyA9IFsiLnN1aXQiLCAiLnhtbCIsICIuVFRGIiwgIi50dGYiXQorCitkZWYgcHV0ZmlsZShwcm9tcHQsIGZpbGVuYW1lLCBuZXdleHRlbnNpb24pOgorCWZvciBleHQgaW4gZXh0ZW5zaW9uczoKKwkJaWYgZmlsZW5hbWVbLWxlbihleHQpOl0gPT0gZXh0OgorCQkJZmlsZW5hbWUgPSBmaWxlbmFtZVs6LWxlbihleHQpXSArIG5ld2V4dGVuc2lvbgorCQkJYnJlYWsKKwllbHNlOgorCQlmaWxlbmFtZSA9IGZpbGVuYW1lICsgbmV3ZXh0ZW5zaW9uCisJZnNzLCBvayA9IG1hY2ZzLlN0YW5kYXJkUHV0RmlsZShwcm9tcHQsIGZpbGVuYW1lKQorCWlmIG9rOgorCQlyZXR1cm4gZnNzLmFzX3BhdGhuYW1lKCkKKworCitkZWYgbGluZXRvKHB0LCBkb25lX21vdmV0byk6CisJeCwgeSA9IHB0CisJaWYgZG9uZV9tb3ZldG86CisJCUFUTS5maWxsTGluZVRvQVRNKCh4LCB5KSkKKwllbHNlOgorCQlBVE0uZmlsbE1vdmVUb0FUTSgoeCwgeSkpCisJcmV0dXJuIHB0CisKK2RlZiBxY3VydmV0byhwdDAsIHB0MSwgcHQyLCBkb25lX21vdmV0byk6CisJaWYgbm90IGRvbmVfbW92ZXRvOgorCQl4MCwgeTAgPSBwdDAKKwkJQVRNLmZpbGxNb3ZlVG9BVE0oKHgwLCB5MCkpCisJeDFhLCB5MWEgPSBwdDAgKyAwLjY2NjY2NjY2NjY2NjcgKiAocHQxIC0gcHQwKQorCXgxYiwgeTFiID0gcHQyICsgMC42NjY2NjY2NjY2NjY3ICogKHB0MSAtIHB0MikKKwl4MiwgeTIgPSBwdDIKKwlBVE0uZmlsbEN1cnZlVG9BVE0oKHgxYSwgeTFhKSwgKHgxYiwgeTFiKSwgKHgyLCB5MikpCisJcmV0dXJuIHB0MgorCmRpZmYgLS1naXQgYS9MaWIvZm9udFRvb2xzL3R0TGliL3htbEltcG9ydC5weSBiL0xpYi9mb250VG9vbHMvdHRMaWIveG1sSW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDNiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZm9udFRvb2xzL3R0TGliL3htbEltcG9ydC5weQpAQCAtMCwwICsxLDE5NiBAQAorZnJvbSBmb250VG9vbHMgaW1wb3J0IHR0TGliCitmcm9tIGZvbnRUb29scy5taXNjLnRleHRUb29scyBpbXBvcnQgc2FmZUV2YWwKK2ltcG9ydCB0eXBlcworaW1wb3J0IHN0cmluZworaW1wb3J0IE51bWVyaWMsIGFycmF5Citmcm9tIHhtbC5wYXJzZXJzLnhtbHByb2MgaW1wb3J0IHhtbHByb2MKKworCit4bWxlcnJvciA9ICJ4bWxlcnJvciIKK3htbF9wYXJzZV9lcnJvciA9ICJYTUwgcGFyc2UgZXJyb3IiCisKKworY2xhc3MgVW5pY29kZVN0cmluZzoKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorCQlpZiBpc2luc3RhbmNlKHZhbHVlLCBVbmljb2RlU3RyaW5nKToKKwkJCXNlbGYudmFsdWUgPSB2YWx1ZS52YWx1ZQorCQllbHNlOgorCQkJaWYgdHlwZSh2YWx1ZSkgPT0gdHlwZXMuU3RyaW5nVHlwZToKKwkJCQkjIFNpbmNlIE51bWVyaWMgaW50ZXJwcmV0cyBjaGFyIGNvZGVzIGFzICpzaWduZWQqLAorCQkJCSMgd2UgZmVlZCBpdCB0aHJvdWdoIHRoZSBhcnJheSBtb2R1bGUuCisJCQkJdmFsdWUgPSBhcnJheS5hcnJheSgiQiIsIHZhbHVlKQorCQkJc2VsZi52YWx1ZSA9IE51bWVyaWMuYXJyYXkodmFsdWUsIE51bWVyaWMuSW50MTYpCisJCisJZGVmIF9fbGVuX18oc2VsZik6CisJCXJldHVybiBsZW4oc2VsZi52YWx1ZSkKKwkKKwkjZGVmIF9faGFzaF9fKHNlbGYpOgorCSMJcmV0dXJuIGhhc2goc2VsZi52YWx1ZS50b3N0cmluZygpKQorCSMKKwkjZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorCSMJaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFVuaWNvZGVTdHJpbmcpOgorCSMJCXJldHVybiAxCisJIwllbHNlOgorCSMJCXJldHVybiBub3QgTnVtZXJpYy5hbGx0cnVlKAorCSMJCQkJTnVtZXJpYy5lcXVhbChzZWxmLnZhbHVlLCBvdGhlci52YWx1ZSkpCisJCisJZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorCQlpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgVW5pY29kZVN0cmluZyk6CisJCQlvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQorCQlyZXR1cm4gc2VsZi5fX2NsYXNzX18oTnVtZXJpYy5jb25jYXRlbmF0ZSgoc2VsZi52YWx1ZSwgb3RoZXIudmFsdWUpKSkKKwkKKwlkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgorCQlpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgVW5pY29kZVN0cmluZyk6CisJCQlvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQorCQlyZXR1cm4gc2VsZi5fX2NsYXNzX18oTnVtZXJpYy5jb25jYXRlbmF0ZSgob3RoZXIudmFsdWUsIHNlbGYudmFsdWUpKSkKKwkKKwlkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorCQlyZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi52YWx1ZVtpOmpdKQorCQorCWRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKwkJcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYudmFsdWVbaTppKzFdKQorCQorCWRlZiB0b3N0cmluZyhzZWxmKToKKwkJdmFsdWUgPSBzZWxmLnZhbHVlCisJCWlmIHR0TGliLmVuZGlhbiA8PiAiYmlnIjoKKwkJCXZhbHVlID0gdmFsdWUuYnl0ZXN3YXBwZWQoKQorCQlyZXR1cm4gdmFsdWUudG9zdHJpbmcoKQorCQorCWRlZiBzdHJpcHBlZChzZWxmKToKKwkJdmFsdWUgPSBzZWxmLnZhbHVlCisJCWkgPSAwCisJCWZvciBpIGluIHJhbmdlKGxlbih2YWx1ZSkpOgorCQkJaWYgdmFsdWVbaV0gbm90IGluICgweGEsIDB4ZCwgMHg5LCAweDIwKToKKwkJCQlicmVhaworCQl2YWx1ZSA9IHZhbHVlW2k6XQorCQlpID0gMAorCQlmb3IgaSBpbiByYW5nZShsZW4odmFsdWUpLTEsIC0xLCAtMSk6CisJCQlpZiB2YWx1ZVtpXSBub3QgaW4gKDB4YSwgMHhkLCAweDksIDB4MjApOgorCQkJCWJyZWFrCisJCXZhbHVlID0gdmFsdWVbOmkrMV0KKwkJcmV0dXJuIHNlbGYuX19jbGFzc19fKHZhbHVlKQorCQorCWRlZiBfX3JlcHJfXyhzZWxmKToKKwkJcmV0dXJuICI8JXMgJXMgYXQgJXg+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgYHNlbGYudmFsdWUudG9zdHJpbmcoKWAsIGlkKHNlbGYpKQorCisKK2NsYXNzIFVuaWNvZGVQcm9jZXNzb3IoeG1scHJvYy5YTUxQcm9jZXNzb3IpOgorCQorCWRlZiBwYXJzZV9jaGFycmVmKHNlbGYpOgorCQkiUGFyc2VzIGEgY2hhcmFjdGVyIHJlZmVyZW5jZS4iCisJCQorCQlpZiBzZWxmLm5vd19hdCgieCIpOgorCQkJZGlncz11bmhleChzZWxmLmdldF9tYXRjaCh4bWxwcm9jLnJlZ19oZXhfZGlnaXRzKSkKKwkJZWxzZToKKwkJCXRyeToKKwkJCQlkaWdzPXN0cmluZy5hdG9pKHNlbGYuZ2V0X21hdGNoKHhtbHByb2MucmVnX2RpZ2l0cykpCisJCQlleGNlcHQgVmFsdWVFcnJvcixlOgorCQkJCXNlbGYucmVwb3J0X2Vycm9yKDMwMjcpCisJCQkJZGlncz1Ob25lCisJCWlmIGRpZ3MgPT0gMTY5OgorCQkJcGFzcworCQlpZiBub3Qgc2VsZi5ub3dfYXQoIjsiKTogc2VsZi5yZXBvcnRfZXJyb3IoMzAwNSwiOyIpCisJCWlmIGRpZ3M9PU5vbmU6IHJldHVybgorCQkKKwkJaWYgbm90IChkaWdzPT05IG9yIGRpZ3M9PTEwIG9yIGRpZ3M9PTEzIG9yIFwKKwkJCQkoZGlncz49MzIgYW5kIGRpZ3M8PTI1NSkpOgorCQkJaWYgZGlncz4yNTU6CisJCQkJc2VsZi5hcHAuaGFuZGxlX2RhdGEoVW5pY29kZVN0cmluZyhbZGlnc10pLDAsMSkKKwkJCWVsc2U6CisJCQkJIyBocm0sIEkgbmVlZCB0byBsZXQgc29tZSBudWxsIGJ5dGVzIGdvIHRocm91Z2guLi4KKwkJCQlzZWxmLmFwcC5oYW5kbGVfZGF0YShjaHIoZGlncyksMCwxKQorCQkJCSNzZWxmLnJlcG9ydF9lcnJvcigzMDE4LGRpZ3MpCisJCWVsc2U6CisJCQlpZiBzZWxmLnN0YWNrPT1bXToKKwkJCQlzZWxmLnJlcG9ydF9lcnJvcigzMDI4KQorCQkJc2VsZi5hcHAuaGFuZGxlX2RhdGEoY2hyKGRpZ3MpLDAsMSkKKworCitjbGFzcyBYTUxFcnJvckhhbmRsZXIoeG1scHJvYy5FcnJvckhhbmRsZXIpOgorCQorCWRlZiBmYXRhbChzZWxmLCBtc2cpOgorCQkiSGFuZGxlcyBhIGZhdGFsIGVycm9yIG1lc3NhZ2UuIgorCQkjIHdlIGRvbid0IHdhbnQgbm8gc3Rpbmtpbicgc3lzLmV4aXQoMSkKKwkJcmFpc2UgeG1sX3BhcnNlX2Vycm9yLCBtc2cKKworCitjbGFzcyBYTUxBcHBsaWNhdGlvbih4bWxwcm9jLkFwcGxpY2F0aW9uKToKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgdHRGb250LCBwcm9ncmVzcz1Ob25lKToKKwkJc2VsZi50dEZvbnQgPSB0dEZvbnQKKwkJc2VsZi5wcm9ncmVzcyA9IHByb2dyZXNzCisJCXNlbGYucm9vdCA9IE5vbmUKKwkJc2VsZi5jb250ZW50X3N0YWNrID0gW10KKwkJc2VsZi5sYXN0cG9zID0gMAorCQorCWRlZiBoYW5kbGVfc3RhcnRfdGFnKHNlbGYsIG5hbWUsIGF0dHJzKToKKwkJaWYgc2VsZi5wcm9ncmVzczoKKwkJCXBvcyA9IHNlbGYubG9jYXRvci5wb3MgKyBzZWxmLmxvY2F0b3IuYmxvY2tfb2Zmc2V0CisJCQlpZiAocG9zIC0gc2VsZi5sYXN0cG9zKSA+IDQwMDA6CisJCQkJc2VsZi5wcm9ncmVzcy5zZXQocG9zIC8gMTAwKQorCQkJCXNlbGYubGFzdHBvcyA9IHBvcworCQlzdGFjayA9IHNlbGYubG9jYXRvci5zdGFjaworCQlzdGFja3NpemUgPSBsZW4oc3RhY2spCisJCWlmIG5vdCBzdGFja3NpemU6CisJCQlpZiBuYW1lIDw+ICJ0dEZvbnQiOgorCQkJCXJhaXNlIHhtbF9wYXJzZV9lcnJvciwgImlsbGVnYWwgcm9vdCB0YWc6ICVzIiAlIG5hbWUKKwkJCXNmbnRWZXJzaW9uID0gYXR0cnMuZ2V0KCJzZm50VmVyc2lvbiIsICJcMDAwXDAwMVwwMDBcMDAwIikKKwkJCWlmIGxlbihzZm50VmVyc2lvbikgPD4gNDoKKwkJCQlzZm50VmVyc2lvbiA9IHNhZmVFdmFsKCciJyArIHNmbnRWZXJzaW9uICsgJyInKQorCQkJc2VsZi50dEZvbnQuc2ZudFZlcnNpb24gPSBzZm50VmVyc2lvbgorCQkJc2VsZi5jb250ZW50X3N0YWNrLmFwcGVuZChbXSkKKwkJZWxpZiBzdGFja3NpemUgPT0gMToKKwkJCW1zZyA9ICJQYXJzaW5nICclcycgdGFibGUuLi4iICUgdHRMaWIueG1sdGFnMnRhZyhuYW1lKQorCQkJaWYgc2VsZi5wcm9ncmVzczoKKwkJCQlzZWxmLnByb2dyZXNzLnNldGxhYmVsKG1zZykKKwkJCWVsaWYgc2VsZi50dEZvbnQudmVyYm9zZToKKwkJCQl0dExpYi5kZWJ1Z21zZyhtc2cpCisJCQllbHNlOgorCQkJCXByaW50IG1zZworCQkJdGFnID0gdHRMaWIueG1sdGFnMnRhZyhuYW1lKQorCQkJdGFibGVjbGFzcyA9IHR0TGliLmdldFRhYmxlQ2xhc3ModGFnKQorCQkJaWYgdGFibGVjbGFzcyBpcyBOb25lOgorCQkJCWZyb20gZm9udFRvb2xzLnR0TGliLnRhYmxlcy5EZWZhdWx0VGFibGUgaW1wb3J0IERlZmF1bHRUYWJsZQorCQkJCXRhYmxlY2xhc3MgPSBEZWZhdWx0VGFibGUKKwkJCXNlbGYuY3VycmVudF90YWJsZSA9IHRhYmxlY2xhc3ModGFnKQorCQkJc2VsZi50dEZvbnRbdGFnXSA9IHNlbGYuY3VycmVudF90YWJsZQorCQkJc2VsZi5jb250ZW50X3N0YWNrLmFwcGVuZChbXSkKKwkJZWxpZiBzdGFja3NpemUgPT0gMjoKKwkJCXNlbGYuY29udGVudF9zdGFjay5hcHBlbmQoW10pCisJCQlzZWxmLnJvb3QgPSAobmFtZSwgYXR0cnMsIHNlbGYuY29udGVudF9zdGFja1stMV0pCisJCWVsc2U6CisJCQlsaXN0ID0gW10KKwkJCXNlbGYuY29udGVudF9zdGFja1stMV0uYXBwZW5kKG5hbWUsIGF0dHJzLCBsaXN0KQorCQkJc2VsZi5jb250ZW50X3N0YWNrLmFwcGVuZChsaXN0KQorCQorCWRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhLCBzdGFydCwgZW5kKToKKwkJaWYgbGVuKHNlbGYubG9jYXRvci5zdGFjaykgPiAxOgorCQkJc2VsZi5jb250ZW50X3N0YWNrWy0xXS5hcHBlbmQoZGF0YVtzdGFydDplbmRdKQorCQorCWRlZiBoYW5kbGVfZW5kX3RhZyhzZWxmLCBuYW1lKToKKwkJZGVsIHNlbGYuY29udGVudF9zdGFja1stMV0KKwkJc3RhY2sgPSBzZWxmLmxvY2F0b3Iuc3RhY2sKKwkJc3RhY2tzaXplID0gbGVuKHN0YWNrKQorCQlpZiBzdGFja3NpemUgPT0gMToKKwkJCXNlbGYucm9vdCA9IE5vbmUKKwkJZWxpZiBzdGFja3NpemUgPT0gMjoKKwkJCXNlbGYuY3VycmVudF90YWJsZS5mcm9tWE1MKHNlbGYucm9vdCwgc2VsZi50dEZvbnQpCisJCQlzZWxmLnJvb3QgPSBOb25lCisKKworY2xhc3MgUHJvZ3Jlc3NQcmludGVyOgorCQorCWRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgbWF4dmFsPTEwMCk6CisJCXByaW50IHRpdGxlCisJCisJZGVmIHNldChzZWxmLCB2YWwsIG1heHZhbD1Ob25lKToKKwkJcGFzcworCQorCWRlZiBpbmNyZW1lbnQoc2VsZiwgdmFsPTEpOgorCQlwYXNzCisJCisJZGVmIHNldGxhYmVsKHNlbGYsIHRleHQpOgorCQlwcmludCB0ZXh0CisKKwo=