ZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9DaGFyc2V0LnB5IGIvTGliL2VtYWlsL0NoYXJzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3NDU5NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9DaGFyc2V0LnB5CkBAIC0wLDAgKzEsMzI3IEBACisjIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogY2hlQGRlYmlhbi5vcmcgKEJlbiBHZXJ0emZpZWxkKQorCitmcm9tIHR5cGVzIGltcG9ydCBVbmljb2RlVHlwZQorZnJvbSBlbWFpbC5FbmNvZGVycyBpbXBvcnQgZW5jb2RlXzdvcjhiaXQKK2ltcG9ydCBlbWFpbC5iYXNlNjRNSU1FCitpbXBvcnQgZW1haWwucXVvcHJpTUlNRQorCisKKwwKKyMgRmxhZ3MgZm9yIHR5cGVzIG9mIGhlYWRlciBlbmNvZGluZ3MKK1FQICAgICA9IDEgICMgUXVvdGVkLVByaW50YWJsZQorQkFTRTY0ID0gMiAgIyBCYXNlNjQKKworIyBJbiAiPT9jaGFyc2V0P3E/aGVsbG9fd29ybGQ/PSIsIHRoZSA9PywgP3E/LCBhbmQgPz0gYWRkIHVwIHRvIDcKK01JU0NfTEVOID0gNyAKKworREVGQVVMVF9DSEFSU0VUID0gJ3VzLWFzY2lpJworCisKKwwKKyMgRGVmYXVsdHMKK0NIQVJTRVRTID0geworICAgICMgaW5wdXQgICAgICAgIGhlYWRlciBlbmMgIGJvZHkgZW5jIG91dHB1dCBjb252CisgICAgJ2lzby04ODU5LTEnOiAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksIAorICAgICdpc28tODg1OS0yJzogIChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICd1cy1hc2NpaSc6ICAgIChOb25lLCAgICAgIE5vbmUsICAgIE5vbmUpLAorICAgICdiaWc1JzogICAgICAgIChCQVNFNjQsICAgIEJBU0U2NCwgIE5vbmUpLAorICAgICdnYjIzMTInOiAgICAgIChCQVNFNjQsICAgIEJBU0U2NCwgIE5vbmUpLCAKKyAgICAnZXVjLWpwJzogICAgICAoQkFTRTY0LCAgICBOb25lLCAgICAnaXNvLTIwMjItanAnKSwKKyAgICAnc2hpZnRfamlzJzogICAoQkFTRTY0LCAgICBOb25lLCAgICAnaXNvLTIwMjItanAnKSwKKyAgICAnaXNvLTIwMjItanAnOiAoQkFTRTY0LCAgICBOb25lLCAgICBOb25lKSwKKyAgICAna29pOC1yJzogICAgICAoQkFTRTY0LCAgICBCQVNFNjQsICBOb25lKSwKKyAgICAndXRmLTgnOiAgICAgICAoQkFTRTY0LCAgICBCQVNFNjQsICAndXRmLTgnKSwKKyAgICB9CisKKyMgQWxpYXNlcyBmb3Igb3RoZXIgY29tbW9ubHktdXNlZCBuYW1lcyBmb3IgY2hhcmFjdGVyIHNldHMuICBNYXAKKyMgdGhlbSB0byB0aGUgcmVhbCBvbmVzIHVzZWQgaW4gZW1haWwuCitBTElBU0VTID0geworICAgICdsYXRpbl8xJzogJ2lzby04ODU5LTEnLAorICAgICdsYXRpbi0xJzogJ2lzby04ODU5LTEnLAorICAgICdhc2NpaSc6ICAgJ3VzLWFzY2lpJywKKyAgICB9CisKKyMgTWFwIGNoYXJzZXRzIHRvIHRoZWlyIFVuaWNvZGUgY29kZWMgc3RyaW5ncy4gIE5vdGUgdGhhdCB0aGUgSmFwYW5lc2UKKyMgZXhhbXBsZXMgaW5jbHVkZWQgYmVsb3cgZG8gbm90ICh5ZXQpIGNvbWUgd2l0aCBQeXRob24hICBUaGV5IGFyZSBhdmFpbGFibGUKKyMgZnJvbSBodHRwOi8vcHNldWRvLmdyYWQuc2Njcy5jaHVreW8tdS5hYy5qcC9+a2FqaXlhbWEvcHl0aG9uLworCisjIFRoZSBDaGluZXNlIGFuZCBLb3JlYW4gY29kZWNzIGFyZSBhdmFpbGFibGUgZnJvbSBTb3VyY2VGb3JnZToKKyMKKyMgICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvcHl0aG9uLWNvZGVjcy8KKyMKKyMgYWx0aG91Z2ggeW91J2xsIG5lZWQgdG8gY2hlY2sgdGhlbSBvdXQgb2YgY3ZzIHNpbmNlIHRoZXkgaGF2ZW4ndCBiZWVuIGZpbGUKKyMgcmVsZWFzZWQgeWV0LiAgWW91IG1pZ2h0IGFsc28gdHJ5IHRvIHVzZQorIworIyAgICAgaHR0cDovL3d3dy5mcmVzaHBvcnRzLm9yZy9wb3J0LWRlc2NyaXB0aW9uLnBocDM/cG9ydD02NzAyCisjCisjIGlmIHlvdSBjYW4gZ2V0IGxvZ2dlZCBpbi4gIEFGQUlDVCwgYm90aCB0aGUgQ2hpbmVzZSBhbmQgS29yZWFuIGNvZGVjcyBhcmUKKyMgZmFpcmx5IGV4cGVyaW1lbnRhbCBhdCB0aGlzIHBvaW50LgorQ09ERUNfTUFQID0geworICAgICdldWMtanAnOiAgICAgICdqYXBhbmVzZS5ldWMtanAnLAorICAgICdpc28tMjAyMi1qcCc6ICdqYXBhbmVzZS5pc28tMjAyMi1qcCcsCisgICAgJ3NoaWZ0X2ppcyc6ICAgJ2phcGFuZXNlLnNoaWZ0X2ppcycsCisgICAgJ2diMjEzMic6ICAgICAgJ2V1Y2diMjMxMl9jbicsCisgICAgJ2JpZzUnOiAgICAgICAgJ2JpZzVfdHcnLAorICAgICd1dGYtOCc6ICAgICAgICd1dGYtOCcsCisgICAgIyBIYWNrOiBXZSBkb24ndCB3YW50ICphbnkqIGNvbnZlcnNpb24gZm9yIHN0dWZmIG1hcmtlZCB1cy1hc2NpaSwgYXMgYWxsCisgICAgIyBzb3J0cyBvZiBnYXJiYWdlIG1pZ2h0IGJlIHNlbnQgdG8gdXMgaW4gdGhlIGd1aXNlIG9mIDctYml0IHVzLWFzY2lpLgorICAgICMgTGV0IHRoYXQgc3R1ZmYgcGFzcyB0aHJvdWdoIHdpdGhvdXQgY29udmVyc2lvbiB0by9mcm9tIFVuaWNvZGUuCisgICAgJ3VzLWFzY2lpJzogICAgTm9uZSwKKyAgICB9CisKKworDAorIyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGV4dGVuZGluZyB0aGUgYWJvdmUgbWFwcGluZ3MKK2RlZiBhZGRfY2hhcnNldChjaGFyc2V0LCBoZWFkZXJfZW5jPU5vbmUsIGJvZHlfZW5jPU5vbmUsIG91dHB1dF9jaGFyc2V0PU5vbmUpOgorICAgICIiIkFkZCBjaGFyc2V0IHByb3BlcnRpZXMgdG8gdGhlIGdsb2JhbCBtYXAuCisKKyAgICBjaGFyc2V0IGlzIHRoZSBpbnB1dCBjaGFyYWN0ZXIgc2V0LCBhbmQgbXVzdCBiZSB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYQorICAgIGNoYXJhY3RlciBzZXQuCisKKyAgICBPcHRpb25hbCBoZWFkZXJfZW5jIGFuZCBib2R5X2VuYyBpcyBlaXRoZXIgQ2hhcnNldC5RUCBmb3IKKyAgICBxdW90ZWQtcHJpbnRhYmxlLCBDaGFyc2V0LkJBU0U2NCBmb3IgYmFzZTY0IGVuY29kaW5nLCBvciBOb25lIGZvciBubworICAgIGVuY29kaW5nLiAgSXQgZGVzY3JpYmVzIGhvdyBtZXNzYWdlIGhlYWRlcnMgYW5kIG1lc3NhZ2UgYm9kaWVzIGluIHRoZQorICAgIGlucHV0IGNoYXJzZXQgYXJlIHRvIGJlIGVuY29kZWQuICBEZWZhdWx0IGlzIG5vIGVuY29kaW5nLgorCisgICAgT3B0aW9uYWwgb3V0cHV0X2NoYXJzZXQgaXMgdGhlIGNoYXJhY3RlciBzZXQgdGhhdCB0aGUgb3V0cHV0IHNob3VsZCBiZQorICAgIGluLiAgQ29udmVyc2lvbnMgd2lsbCBwcm9jZWVkIGZyb20gaW5wdXQgY2hhcnNldCwgdG8gVW5pY29kZSwgdG8gdGhlCisgICAgb3V0cHV0IGNoYXJzZXQgd2hlbiB0aGUgbWV0aG9kIENoYXJzZXQuY29udmVydCgpIGlzIGNhbGxlZC4gIFRoZSBkZWZhdWx0CisgICAgaXMgdG8gb3V0cHV0IGluIHRoZSBzYW1lIGNoYXJhY3RlciBzZXQgYXMgdGhlIGlucHV0LgorCisgICAgQm90aCBpbnB1dF9jaGFyc2V0IGFuZCBvdXRwdXRfY2hhcnNldCBtdXN0IGhhdmUgVW5pY29kZSBjb2RlYyBlbnRyaWVzIGluCisgICAgdGhlIG1vZHVsZSdzIGNoYXJzZXQtdG8tY29kZWMgbWFwcGluZzsgdXNlIGFkZF9jb2RlYyhjaGFyc2V0LCBjb2RlY25hbWUpCisgICAgdG8gYWRkIGNvZGVjcyB0aGUgbW9kdWxlIGRvZXMgbm90IGtub3cgYWJvdXQuICBTZWUgdGhlIGNvZGVjIG1vZHVsZSdzCisgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAiIiIKKyAgICBDSEFSU0VUU1tjaGFyc2V0XSA9IChoZWFkZXJfZW5jLCBib2R5X2VuYywgb3V0cHV0X2NoYXJzZXQpCisKKworZGVmIGFkZF9hbGlhcyhhbGlhcywgY2Fub25pY2FsKToKKyAgICAiIiJBZGQgYSBjaGFyYWN0ZXIgc2V0IGFsaWFzLgorCisgICAgYWxpYXMgaXMgdGhlIGFsaWFzIG5hbWUsIGUuZy4gbGF0aW4tMQorICAgIGNhbm9uaWNhbCBpcyB0aGUgY2hhcmFjdGVyIHNldCdzIGNhbm9uaWNhbCBuYW1lLCBlLmcuIGlzby04ODU5LTEKKyAgICAiIiIKKyAgICBBTElBU0VTW2FsaWFzXSA9IGNhbm9uaWNhbAorCisKK2RlZiBhZGRfY29kZWMoY2hhcnNldCwgY29kZWNuYW1lKToKKyAgICAiIiJBZGQgYSBjb2RlYyB0aGF0IG1hcCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBjaGFyc2V0IHRvL2Zyb20gVW5pY29kZS4KKworICAgIGNoYXJzZXQgaXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldC4gIGNvZGVjbmFtZSBpcyB0aGUgbmFtZQorICAgIG9mIGEgUHl0aG9uIGNvZGVjLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgdW5pY29kZSgpCisgICAgYnVpbHQtaW4sIG9yIHRvIHRoZSAuZW5jb2RlKCkgbWV0aG9kIG9mIGEgVW5pY29kZSBzdHJpbmcuCisgICAgIiIiCisgICAgQ09ERUNfTUFQW2NoYXJzZXRdID0gY29kZWNuYW1lCisKKworDAorY2xhc3MgQ2hhcnNldDoKKyAgICAiIiJNYXAgY2hhcmFjdGVyIHNldHMgdG8gdGhlaXIgZW1haWwgcHJvcGVydGllcy4KKworICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVpcmVtZW50cyBpbXBvc2VkIG9uIGVtYWlsCisgICAgZm9yIGEgc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4gIEl0IGFsc28gcHJvdmlkZXMgY29udmVuaWVuY2Ugcm91dGluZXMgZm9yCisgICAgY29udmVydGluZyBiZXR3ZWVuIGNoYXJhY3RlciBzZXRzLCBnaXZlbiB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZQorICAgIGFwcGxpY2FibGUgY29kZWNzLiAgR2l2ZW4gYW4gY2hhcmFjdGVyIHNldCwgaXQgd2lsbCBkbyBpdHMgYmVzdCB0byBwcm92aWRlCisgICAgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGF0IGNoYXJhY3RlciBzZXQgaW4gYW4gZW1haWwuCisgICAgCisgICAgQ2VydGFpbiBjaGFyYWN0ZXIgc2V0cyBtdXN0IGJlIGVuY29kZWQgd2l0aCBxdW90ZWQtcHJpbnRhYmxlIG9yIGJhc2U2NAorICAgIHdoZW4gdXNlZCBpbiBlbWFpbCBoZWFkZXJzIG9yIGJvZGllcy4gIENlcnRhaW4gY2hhcmFjdGVyIHNldHMgbXVzdCBiZQorICAgIGNvbnZlcnRlZCBvdXRyaWdodCwgYW5kIGFyZSBub3QgYWxsb3dlZCBpbiBlbWFpbC4gIEluc3RhbmNlcyBvZiB0aGlzCisgICAgbW9kdWxlIGV4cG9zZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY2hhcmFjdGVyIHNldDoKKworICAgIGlucHV0X2NoYXJzZXQ6IFRoZSBpbml0aWFsIGNoYXJhY3RlciBzZXQgc3BlY2lmaWVkLiAgQ29tbW9uIGFsaWFzZXMKKyAgICAgICAgICAgICAgICAgICBhcmUgY29udmVydGVkIHRvIHRoZWlyIGBvZmZpY2lhbCcgZW1haWwgbmFtZXMgKGUuZy4gbGF0aW5fMQorICAgICAgICAgICAgICAgICAgIGlzIGNvbnZlcnRlZCB0byBpc28tODg1OS0xKS4gIERlZmF1bHRzIHRvIDctYml0IHVzLWFzY2lpLgorCisgICAgaGVhZGVyX2VuY29kaW5nOiBJZiB0aGUgY2hhcmFjdGVyIHNldCBtdXN0IGJlIGVuY29kZWQgYmVmb3JlIGl0IGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBhbiBlbWFpbCBoZWFkZXIsIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICBDaGFyc2V0LlFQIChmb3IgcXVvdGVkLXByaW50YWJsZSkgb3IgQ2hhcnNldC5CQVNFNjQgKGZvcgorICAgICAgICAgICAgICAgICAgICAgYmFzZTY0IGVuY29kaW5nKS4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBOb25lLgorCisgICAgYm9keV9lbmNvZGluZzogU2FtZSBhcyBoZWFkZXJfZW5jb2RpbmcsIGJ1dCBkZXNjcmliZXMgdGhlIGVuY29kaW5nIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICBtYWlsIG1lc3NhZ2UncyBib2R5LCB3aGljaCBpbmRlZWQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZQorICAgICAgICAgICAgICAgICAgIGhlYWRlciBlbmNvZGluZy4KKworICAgIG91dHB1dF9jaGFyc2V0OiBTb21lIGNoYXJhY3RlciBzZXRzIG11c3QgYmUgY29udmVydGVkIGJlZm9yZSB0aGUgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gZW1haWwgaGVhZGVycyBvciBib2RpZXMuICBJZiB0aGUgaW5wdXRfY2hhcnNldCBpcworICAgICAgICAgICAgICAgICAgICBvbmUgb2YgdGhlbSwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICBjaGFyc2V0IG91dHB1dCB3aWxsIGJlIGNvbnZlcnRlZCB0by4gIE90aGVyd2lzZSwgaXQgd2lsbAorICAgICAgICAgICAgICAgICAgICBiZSBOb25lLgorCisgICAgaW5wdXRfY29kZWM6IFRoZSBuYW1lIG9mIHRoZSBQeXRob24gY29kZWMgdXNlZCB0byBjb252ZXJ0IHRoZQorICAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0IHRvIFVuaWNvZGUuICBJZiBubyBjb252ZXJzaW9uIGNvZGVjIGlzCisgICAgICAgICAgICAgICAgIG5lY2Vzc2FyeSwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBOb25lLgorCisgICAgb3V0cHV0X2NvZGVjOiBUaGUgbmFtZSBvZiB0aGUgUHl0aG9uIGNvZGVjIHVzZWQgdG8gY29udmVydCBVbmljb2RlCisgICAgICAgICAgICAgICAgICB0byB0aGUgb3V0cHV0X2NoYXJzZXQuICBJZiBubyBjb252ZXJzaW9uIGNvZGVjIGlzIG5lY2Vzc2FyeSwKKyAgICAgICAgICAgICAgICAgIHRoaXMgYXR0cmlidXRlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgaW5wdXRfY29kZWMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0X2NoYXJzZXQ9REVGQVVMVF9DSEFSU0VUKToKKyAgICAgICAgIyBTZXQgdGhlIGlucHV0IGNoYXJzZXQgYWZ0ZXIgZmlsdGVyaW5nIHRocm91Z2ggdGhlIGFsaWFzZXMKKyAgICAgICAgc2VsZi5pbnB1dF9jaGFyc2V0ID0gQUxJQVNFUy5nZXQoaW5wdXRfY2hhcnNldCwgaW5wdXRfY2hhcnNldCkKKyAgICAgICAgIyBXZSBjYW4gdHJ5IHRvIGd1ZXNzIHdoaWNoIGVuY29kaW5nIGFuZCBjb252ZXJzaW9uIHRvIHVzZSBieSB0aGUKKyAgICAgICAgIyBjaGFyc2V0X21hcCBkaWN0aW9uYXJ5LiAgVHJ5IHRoYXQgZmlyc3QsIGJ1dCBsZXQgdGhlIHVzZXIgb3ZlcnJpZGUKKyAgICAgICAgIyBpdC4KKyAgICAgICAgaGVuYywgYmVuYywgY29udiA9IENIQVJTRVRTLmdldChzZWxmLmlucHV0X2NoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJBU0U2NCwgQkFTRTY0LCBOb25lKSkKKyAgICAgICAgIyBTZXQgdGhlIGF0dHJpYnV0ZXMsIGFsbG93aW5nIHRoZSBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisgICAgICAgIHNlbGYuaGVhZGVyX2VuY29kaW5nID0gaGVuYworICAgICAgICBzZWxmLmJvZHlfZW5jb2RpbmcgPSBiZW5jCisgICAgICAgIHNlbGYub3V0cHV0X2NoYXJzZXQgPSBBTElBU0VTLmdldChjb252LCBjb252KQorICAgICAgICAjIE5vdyBzZXQgdGhlIGNvZGVjcy4gIElmIG9uZSBpc24ndCBkZWZpbmVkIGZvciBpbnB1dF9jaGFyc2V0LAorICAgICAgICAjIGd1ZXNzIGFuZCB0cnkgYSBVbmljb2RlIGNvZGVjIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBpbnB1dF9jb2RlYy4KKyAgICAgICAgc2VsZi5pbnB1dF9jb2RlYyA9IENPREVDX01BUC5nZXQoc2VsZi5pbnB1dF9jaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlucHV0X2NoYXJzZXQpCisgICAgICAgIHNlbGYub3V0cHV0X2NvZGVjID0gQ09ERUNfTUFQLmdldChzZWxmLm91dHB1dF9jaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlucHV0X2NvZGVjKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmlucHV0X2NoYXJzZXQubG93ZXIoKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZikgPT0gc3RyKG90aGVyKS5sb3dlcigpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKKworICAgIGRlZiBnZXRfYm9keV9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nIHVzZWQgZm9yIGJvZHkgZW5jb2RpbmcuCisKKyAgICAgICAgVGhpcyBpcyBlaXRoZXIgdGhlIHN0cmluZyBgcXVvdGVkLXByaW50YWJsZScgb3IgYGJhc2U2NCcgZGVwZW5kaW5nIG9uCisgICAgICAgIHRoZSBlbmNvZGluZyB1c2VkLCBvciBpdCBpcyBhIGZ1bmN0aW9uIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBjYWxsCisgICAgICAgIHRoZSBmdW5jdGlvbiB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LCB0aGUgTWVzc2FnZSBvYmplY3QgYmVpbmcKKyAgICAgICAgZW5jb2RlZC4gIFRoZSBmdW5jdGlvbiBzaG91bGQgdGhlbiBzZXQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6CisgICAgICAgIGhlYWRlciBpdHNlbGYgdG8gd2hhdGV2ZXIgaXMgYXBwcm9wcmlhdGUuCisKKyAgICAgICAgUmV0dXJucyAicXVvdGVkLXByaW50YWJsZSIgaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIFFQLgorICAgICAgICBSZXR1cm5zICJiYXNlNjQiIGlmIHNlbGYuYm9keV9lbmNvZGluZyBpcyBCQVNFNjQuCisgICAgICAgIFJldHVybnMgIjdiaXQiIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuYm9keV9lbmNvZGluZyA9PSBRUDoKKyAgICAgICAgICAgIHJldHVybiAncXVvdGVkLXByaW50YWJsZScKKyAgICAgICAgZWxpZiBzZWxmLmJvZHlfZW5jb2RpbmcgPT0gQkFTRTY0OgorICAgICAgICAgICAgcmV0dXJuICdiYXNlNjQnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZW5jb2RlXzdvcjhiaXQKKworICAgIGRlZiBjb252ZXJ0KHNlbGYsIHMpOgorICAgICAgICAiIiJDb252ZXJ0IGEgc3RyaW5nIGZyb20gdGhlIGlucHV0X2NvZGVjIHRvIHRoZSBvdXRwdXRfY29kZWMuIiIiCisgICAgICAgIGlmIHNlbGYuaW5wdXRfY29kZWMgPD4gc2VsZi5vdXRwdXRfY29kZWM6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShzLCBzZWxmLmlucHV0X2NvZGVjKS5lbmNvZGUoc2VsZi5vdXRwdXRfY29kZWMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcworCisgICAgZGVmIHRvX3NwbGl0dGFibGUoc2VsZiwgcyk6CisgICAgICAgICIiIkNvbnZlcnQgYSBwb3NzaWJseSBtdWx0aWJ5dGUgc3RyaW5nIHRvIGEgc2FmZWx5IHNwbGl0dGFibGUgZm9ybWF0LgorCisgICAgICAgIFVzZXMgdGhlIGlucHV0X2NvZGVjIHRvIHRyeSBhbmQgY29udmVydCB0aGUgc3RyaW5nIHRvIFVuaWNvZGUsIHNvIGl0CisgICAgICAgIGNhbiBiZSBzYWZlbHkgc3BsaXQgb24gY2hhcmFjdGVyIGJvdW5kYXJpZXMgKGV2ZW4gZm9yIGRvdWJsZS1ieXRlCisgICAgICAgIGNoYXJhY3RlcnMpLgorCisgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyB1bnRvdWNoZWQgaWYgd2UgZG9uJ3Qga25vdyBob3cgdG8gY29udmVydCBpdCB0bworICAgICAgICBVbmljb2RlIHdpdGggdGhlIGlucHV0X2NoYXJzZXQuCisKKyAgICAgICAgQ2hhcmFjdGVycyB0aGF0IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgIHdpdGggdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIFUrRkZGRC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UocywgVW5pY29kZVR5cGUpIG9yIHNlbGYuaW5wdXRfY29kZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHMsIHNlbGYuaW5wdXRfY29kZWMsICdyZXBsYWNlJykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBJbnB1dCBjb2RlYyBub3QgaW5zdGFsbGVkIG9uIHN5c3RlbSwgc28gcmV0dXJuIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgIyBzdHJpbmcgdW5jaGFuZ2VkLgorICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBmcm9tX3NwbGl0dGFibGUoc2VsZiwgdXN0ciwgdG9fb3V0cHV0PTEpOgorICAgICAgICAiIiJDb252ZXJ0IGEgc3BsaXR0YWJsZSBzdHJpbmcgYmFjayBpbnRvIGFuIGVuY29kZWQgc3RyaW5nLgorCisgICAgICAgIFVzZXMgdGhlIHByb3BlciBjb2RlYyB0byB0cnkgYW5kIGNvbnZlcnQgdGhlIHN0cmluZyBmcm9tCisgICAgICAgIFVuaWNvZGUgYmFjayBpbnRvIGFuIGVuY29kZWQgZm9ybWF0LiAgUmV0dXJuIHRoZSBzdHJpbmcgYXMtaXMKKyAgICAgICAgaWYgaXQgaXMgbm90IFVuaWNvZGUsIG9yIGlmIGl0IGNvdWxkIG5vdCBiZSBlbmNvZGVkIGZyb20KKyAgICAgICAgVW5pY29kZS4KKworICAgICAgICBDaGFyYWN0ZXJzIHRoYXQgY291bGQgbm90IGJlIGNvbnZlcnRlZCBmcm9tIFVuaWNvZGUgd2lsbCBiZSByZXBsYWNlZAorICAgICAgICB3aXRoIGFuIGFwcHJvcHJpYXRlIGNoYXJhY3RlciAodXN1YWxseSAnPycpLgorCisgICAgICAgIElmIHRvX291dHB1dCBpcyB0cnVlLCB1c2VzIG91dHB1dF9jb2RlYyB0byBjb252ZXJ0IHRvIGFuIGVuY29kZWQKKyAgICAgICAgZm9ybWF0LiAgSWYgdG9fb3V0cHV0IGlzIGZhbHNlLCB1c2VzIGlucHV0X2NvZGVjLiAgdG9fb3V0cHV0IGRlZmF1bHRzCisgICAgICAgIHRvIDEuCisgICAgICAgICIiIgorICAgICAgICBpZiB0b19vdXRwdXQ6CisgICAgICAgICAgICBjb2RlYyA9IHNlbGYub3V0cHV0X2NvZGVjCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb2RlYyA9IHNlbGYuaW5wdXRfY29kZWMKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXN0ciwgVW5pY29kZVR5cGUpIG9yIGNvZGVjIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdXN0cgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdXN0ci5lbmNvZGUoY29kZWMsICdyZXBsYWNlJykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBPdXRwdXQgY29kZWMgbm90IGluc3RhbGxlZAorICAgICAgICAgICAgcmV0dXJuIHVzdHIKKworICAgIGRlZiBnZXRfb3V0cHV0X2NoYXJzZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgb3V0cHV0IGNoYXJhY3RlciBzZXQuCisKKyAgICAgICAgVGhpcyBpcyBzZWxmLm91dHB1dF9jaGFyc2V0IGlmIHRoYXQgaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMKKyAgICAgICAgc2VsZi5pbnB1dF9jaGFyc2V0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYub3V0cHV0X2NoYXJzZXQgb3Igc2VsZi5pbnB1dF9jaGFyc2V0CisKKyAgICBkZWYgZW5jb2RlZF9oZWFkZXJfbGVuKHNlbGYsIHMpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZW5jb2RlZCBoZWFkZXIgc3RyaW5nLiIiIgorICAgICAgICBjc2V0ID0gc2VsZi5nZXRfb3V0cHV0X2NoYXJzZXQoKQorICAgICAgICAjIFRoZSBsZW4ocykgb2YgYSA3Yml0IGVuY29kaW5nIGlzIGxlbihzKQorICAgICAgICBpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyBpcyBCQVNFNjQ6CisgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0TUlNRS5iYXNlNjRfbGVuKHMpICsgbGVuKGNzZXQpICsgTUlTQ19MRU4KKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyBpcyBRUDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfbGVuKHMpICsgbGVuKGNzZXQpICsgTUlTQ19MRU4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBsZW4ocykKKworICAgIGRlZiBoZWFkZXJfZW5jb2RlKHNlbGYsIHMsIGNvbnZlcnQ9MCk6CisgICAgICAgICIiIkhlYWRlci1lbmNvZGUgYSBzdHJpbmcsIG9wdGlvbmFsbHkgY29udmVydGluZyBpdCB0byBvdXRwdXRfY2hhcnNldC4KKworICAgICAgICBJZiBjb252ZXJ0IGlzIHRydWUsIHRoZSBzdHJpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSB0aGUgaW5wdXQKKyAgICAgICAgY2hhcnNldCB0byB0aGUgb3V0cHV0IGNoYXJzZXQgYXV0b21hdGljYWxseS4gIFRoaXMgaXMgbm90IHVzZWZ1bCBmb3IKKyAgICAgICAgbXVsdGlieXRlIGNoYXJhY3RlciBzZXRzLCB3aGljaCBoYXZlIGxpbmUgbGVuZ3RoIGlzc3VlcyAobXVsdGlieXRlCisgICAgICAgIGNoYXJhY3RlcnMgbXVzdCBiZSBzcGxpdCBvbiBhIGNoYXJhY3Rlciwgbm90IGEgYnl0ZSBib3VuZGFyeSk7IHVzZSB0aGUKKyAgICAgICAgaGlnaC1sZXZlbCBIZWFkZXIgY2xhc3MgdG8gZGVhbCB3aXRoIHRoZXNlIGlzc3Vlcy4gIGNvbnZlcnQgZGVmYXVsdHMKKyAgICAgICAgdG8gMC4KKworICAgICAgICBUaGUgdHlwZSBvZiBlbmNvZGluZyAoYmFzZTY0IG9yIHF1b3RlZC1wcmludGFibGUpIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgICAgc2VsZi5oZWFkZXJfZW5jb2RpbmcuCisgICAgICAgICIiIgorICAgICAgICBjc2V0ID0gc2VsZi5nZXRfb3V0cHV0X2NoYXJzZXQoKQorICAgICAgICBpZiBjb252ZXJ0OgorICAgICAgICAgICAgcyA9IHNlbGYuY29udmVydChzKQorICAgICAgICAjIDdiaXQvOGJpdCBlbmNvZGluZ3MgcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkIChtb2R1bG8gY29udmVyc2lvbnMpCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nIGlzIEJBU0U2NDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRNSU1FLmhlYWRlcl9lbmNvZGUocywgY3NldCkKKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyBpcyBRUDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9lbmNvZGUocywgY3NldCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgYm9keV9lbmNvZGUoc2VsZiwgcywgY29udmVydD0xKToKKyAgICAgICAgIiIiQm9keS1lbmNvZGUgYSBzdHJpbmcgYW5kIGNvbnZlcnQgaXQgdG8gb3V0cHV0X2NoYXJzZXQuCisKKyAgICAgICAgSWYgY29udmVydCBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBzdHJpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbQorICAgICAgICB0aGUgaW5wdXQgY2hhcnNldCB0byBvdXRwdXQgY2hhcnNldCBhdXRvbWF0aWNhbGx5LiAgVW5saWtlCisgICAgICAgIGhlYWRlcl9lbmNvZGUoKSwgdGhlcmUgYXJlIG5vIGlzc3VlcyB3aXRoIGJ5dGUgYm91bmRhcmllcyBhbmQKKyAgICAgICAgbXVsdGlieXRlIGNoYXJzZXRzIGluIGVtYWlsIGJvZGllcywgc28gdGhpcyBpcyB1c3VhbGx5IHByZXR0eSBzYWZlLgorCisgICAgICAgIFRoZSB0eXBlIG9mIGVuY29kaW5nIChiYXNlNjQgb3IgcXVvdGVkLXByaW50YWJsZSkgd2lsbCBiZSBiYXNlZCBvbgorICAgICAgICBzZWxmLmJvZHlfZW5jb2RpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiBjb252ZXJ0OgorICAgICAgICAgICAgcyA9IHNlbGYuY29udmVydChzKQorICAgICAgICAjIDdiaXQvOGJpdCBlbmNvZGluZ3MgcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkIChtb2R1bGUgY29udmVyc2lvbnMpCisgICAgICAgIGlmIHNlbGYuYm9keV9lbmNvZGluZyBpcyBCQVNFNjQ6CisgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0TUlNRS5ib2R5X2VuY29kZShzKQorICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nIGlzIFFQOgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaU1JTUUuYm9keV9lbmNvZGUocykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvRW5jb2RlcnMucHkgYi9MaWIvZW1haWwvRW5jb2RlcnMucHkKaW5kZXggZDljZDQyZC4uZjA5YWZmYSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0VuY29kZXJzLnB5CisrKyBiL0xpYi9lbWFpbC9FbmNvZGVycy5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogYmFycnlAem9wZS5jb20gKEJhcnJ5IFdhcnNhdykKIAogIiIiTW9kdWxlIGNvbnRhaW5pbmcgZW5jb2RpbmcgZnVuY3Rpb25zIGZvciBJbWFnZS5JbWFnZSBhbmQgVGV4dC5UZXh0LgpAQCAtMTEsNyArMTEsOSBAQAogDAogIyBIZWxwZXJzCiBkZWYgX3FlbmNvZGUocyk6Ci0gICAgcmV0dXJuIF9lbmNvZGVzdHJpbmcocywgcXVvdGV0YWJzPTEpCisgICAgZW5jID0gX2VuY29kZXN0cmluZyhzLCBxdW90ZXRhYnM9MSkKKyAgICAjIE11c3QgZW5jb2RlIHNwYWNlcywgd2hpY2ggcXVvcHJpLmVuY29kZXN0cmluZygpIGRvZXNuJ3QgZG8KKyAgICByZXR1cm4gZW5jLnJlcGxhY2UoJyAnLCAnPTIwJykKIAogCiBkZWYgX2JlbmNvZGUocyk6CkBAIC01NCw2ICs1NiwxMCBAQAogZGVmIGVuY29kZV83b3I4Yml0KG1zZyk6CiAgICAgIiIiU2V0IHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBoZWFkZXIgdG8gN2JpdCBvciA4Yml0LiIiIgogICAgIG9yaWcgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgIGlmIG9yaWcgaXMgTm9uZToKKyAgICAgICAgIyBUaGVyZSdzIG5vIHBheWxvYWQuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2UgdXNlIDdiaXQKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAnN2JpdCcKKyAgICAgICAgcmV0dXJuCiAgICAgIyBXZSBwbGF5IGEgdHJpY2sgdG8gbWFrZSB0aGlzIGdvIGZhc3QuICBJZiBlbmNvZGluZyB0byBBU0NJSSBzdWNjZWVkcywgd2UKICAgICAjIGtub3cgdGhlIGRhdGEgbXVzdCBiZSA3Yml0LCBvdGhlcndpc2UgdHJlYXQgaXQgYXMgOGJpdC4KICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvRXJyb3JzLnB5IGIvTGliL2VtYWlsL0Vycm9ycy5weQppbmRleCA3MWQ3NjYzLi5lM2EzNjY2IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvRXJyb3JzLnB5CisrKyBiL0xpYi9lbWFpbC9FcnJvcnMucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IGJhcnJ5QHpvcGUuY29tIChCYXJyeSBXYXJzYXcpCiAKICIiImVtYWlsIHBhY2thZ2UgZXhjZXB0aW9uIGNsYXNzZXMuCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvR2VuZXJhdG9yLnB5IGIvTGliL2VtYWlsL0dlbmVyYXRvci5weQppbmRleCA5ODFlMGZmLi5kYmJjYWJjIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvR2VuZXJhdG9yLnB5CisrKyBiL0xpYi9lbWFpbC9HZW5lcmF0b3IucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IGJhcnJ5QHpvcGUuY29tIChCYXJyeSBXYXJzYXcpCiAKICIiIkNsYXNzZXMgdG8gZ2VuZXJhdGUgcGxhaW4gdGV4dCBmcm9tIGEgbWVzc2FnZSBvYmplY3QgdHJlZS4KQEAgLTE2NiwzMCArMTY2LDMzIEBACiAgICAgICAgICAgICByZXR1cm4gdGV4dAogICAgICAgICBydG4gPSBbXQogICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KCdcbicpOgorICAgICAgICAgICAgc3BsaXRsaW5lID0gW10KICAgICAgICAgICAgICMgU2hvcnQgbGluZXMgY2FuIHJlbWFpbiB1bmNoYW5nZWQKICAgICAgICAgICAgIGlmIGxlbihsaW5lLnJlcGxhY2UoJ1x0JywgU1BBQ0U4KSkgPD0gbWF4aGVhZGVybGVuOgotICAgICAgICAgICAgICAgIHJ0bi5hcHBlbmQobGluZSkKLSAgICAgICAgICAgICAgICBTRU1JTkxUQUIuam9pbihydG4pCisgICAgICAgICAgICAgICAgc3BsaXRsaW5lLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIHJ0bi5hcHBlbmQoU0VNSU5MVEFCLmpvaW4oc3BsaXRsaW5lKSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgb2xkbGVuID0gbGVuKHRleHQpCisgICAgICAgICAgICAgICAgb2xkbGVuID0gbGVuKGxpbmUpCiAgICAgICAgICAgICAgICAgIyBUcnkgdG8gYnJlYWsgdGhlIGxpbmUgb24gc2VtaWNvbG9ucywgYnV0IGlmIHRoYXQgZG9lc24ndAogICAgICAgICAgICAgICAgICMgd29yaywgdHJ5IHRvIHNwbGl0IG9uIGZvbGRpbmcgd2hpdGVzcGFjZS4KLSAgICAgICAgICAgICAgICB3aGlsZSBsZW4odGV4dCkgPiBtYXhoZWFkZXJsZW46Ci0gICAgICAgICAgICAgICAgICAgIGkgPSB0ZXh0LnJmaW5kKCc7JywgMCwgbWF4aGVhZGVybGVuKQorICAgICAgICAgICAgICAgIHdoaWxlIGxlbihsaW5lKSA+IG1heGhlYWRlcmxlbjoKKyAgICAgICAgICAgICAgICAgICAgaSA9IGxpbmUucmZpbmQoJzsnLCAwLCBtYXhoZWFkZXJsZW4pCiAgICAgICAgICAgICAgICAgICAgIGlmIGkgPCAwOgogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgcnRuLmFwcGVuZCh0ZXh0WzppXSkKLSAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRbaSsxOl0ubHN0cmlwKCkKLSAgICAgICAgICAgICAgICBpZiBsZW4odGV4dCkgPD4gb2xkbGVuOgorICAgICAgICAgICAgICAgICAgICBzcGxpdGxpbmUuYXBwZW5kKGxpbmVbOmldKQorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVtpKzE6XS5sc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lKSA8PiBvbGRsZW46CiAgICAgICAgICAgICAgICAgICAgICMgU3BsaXR0aW5nIG9uIHNlbWlzIHdvcmtlZAotICAgICAgICAgICAgICAgICAgICBydG4uYXBwZW5kKHRleHQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTRU1JTkxUQUIuam9pbihydG4pCisgICAgICAgICAgICAgICAgICAgIHNwbGl0bGluZS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICAgICAgcnRuLmFwcGVuZChTRU1JTkxUQUIuam9pbihzcGxpdGxpbmUpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICMgU3BsaXR0aW5nIG9uIHNlbWlzIGRpZG4ndCBoZWxwLCBzbyB0cnkgdG8gc3BsaXQgb24KICAgICAgICAgICAgICAgICAjIHdoaXRlc3BhY2UuCi0gICAgICAgICAgICAgICAgcGFydHMgPSByZS5zcGxpdChyJyhccyspJywgdGV4dCkKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlLnNwbGl0KHInKFxzKyknLCBsaW5lKQogICAgICAgICAgICAgICAgICMgV2F0Y2ggb3V0IHRob3VnaCBmb3IgIkhlYWRlcjogbG9uZ25vbnNwbGl0dGFibGVsaW5lIgogICAgICAgICAgICAgICAgIGlmIHBhcnRzWzBdLmVuZHN3aXRoKCc6JykgYW5kIGxlbihwYXJ0cykgPT0gMzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQKKyAgICAgICAgICAgICAgICAgICAgcnRuLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIGZpcnN0ID0gcGFydHMucG9wKDApCiAgICAgICAgICAgICAgICAgc3VibGluZXMgPSBbZmlyc3RdCiAgICAgICAgICAgICAgICAgYWNjID0gbGVuKGZpcnN0KQpAQCAtMjAzLDEzICsyMDYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICMgU3BsaXQgaXQgaGVyZSwgYnV0IGRvbid0IGZvcmdldCB0byBpZ25vcmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAjIG5leHQgd2hpdGVzcGFjZS1vbmx5IHBhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ0bi5hcHBlbmQoRU1QVFlTVFJJTkcuam9pbihzdWJsaW5lcykpCisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdGxpbmUuYXBwZW5kKEVNUFRZU1RSSU5HLmpvaW4oc3VibGluZXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHBhcnRzWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHBhcnRzLnBvcCgwKQogICAgICAgICAgICAgICAgICAgICAgICAgc3VibGluZXMgPSBbZmlyc3RdCiAgICAgICAgICAgICAgICAgICAgICAgICBhY2MgPSBsZW4oZmlyc3QpCi0gICAgICAgICAgICAgICAgcnRuLmFwcGVuZChFTVBUWVNUUklORy5qb2luKHN1YmxpbmVzKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTkxUQUIuam9pbihydG4pCisgICAgICAgICAgICAgICAgc3BsaXRsaW5lLmFwcGVuZChFTVBUWVNUUklORy5qb2luKHN1YmxpbmVzKSkKKyAgICAgICAgICAgICAgICBydG4uYXBwZW5kKE5MVEFCLmpvaW4oc3BsaXRsaW5lKSkKKyAgICAgICAgcmV0dXJuIE5MLmpvaW4ocnRuKQogCiAgICAgIwogICAgICMgSGFuZGxlcnMgZm9yIHdyaXRpbmcgdHlwZXMgYW5kIHN1YnR5cGVzCkBAIC0yMTksNiArMjIzLDkgQEAKICAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCiAgICAgICAgIGlmIHBheWxvYWQgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgorICAgICAgICBjc2V0ID0gbXNnLmdldF9jaGFyc2V0KCkKKyAgICAgICAgaWYgY3NldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBheWxvYWQgPSBjc2V0LmJvZHlfZW5jb2RlKHBheWxvYWQpCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBheWxvYWQsIFN0cmluZ1R5cGUpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnc3RyaW5nIHBheWxvYWQgZXhwZWN0ZWQ6ICVzJyAlIHR5cGUocGF5bG9hZCkKICAgICAgICAgaWYgc2VsZi5fbWFuZ2xlX2Zyb21fOgpAQCAtMjMzLDcgKzI0MCwxOCBAQAogICAgICAgICAjIHRvZ2V0aGVyLCBhbmQgdGhlbiBtYWtlIHN1cmUgdGhhdCB0aGUgYm91bmRhcnkgd2UndmUgY2hvc2VuIGlzbid0CiAgICAgICAgICMgcHJlc2VudCBpbiB0aGUgcGF5bG9hZC4KICAgICAgICAgbXNndGV4dHMgPSBbXQotICAgICAgICBmb3IgcGFydCBpbiBtc2cuZ2V0X3BheWxvYWQoKToKKyAgICAgICAgc3VicGFydHMgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgICAgICBpZiBzdWJwYXJ0cyBpcyBOb25lOgorICAgICAgICAgICAgIyBOb3RoaW5nIGhhcyBldmVyeSBiZWVuIGF0dGFjaGVkCisgICAgICAgICAgICBib3VuZGFyeSA9IG1zZy5nZXRfYm91bmRhcnkoZmFpbG9iaj1fbWFrZV9ib3VuZGFyeSgpKQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsICctLScgKyBib3VuZGFyeQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsICdcbicKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCAnLS0nICsgYm91bmRhcnkgKyAnLS0nCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzdWJwYXJ0cywgTGlzdFR5cGUpOgorICAgICAgICAgICAgIyBTY2FsYXIgcGF5bG9hZAorICAgICAgICAgICAgc3VicGFydHMgPSBbc3VicGFydHNdCisgICAgICAgIGZvciBwYXJ0IGluIHN1YnBhcnRzOgogICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKICAgICAgICAgICAgIGcgPSBzZWxmLl9fY2xhc3NfXyhzLCBzZWxmLl9tYW5nbGVfZnJvbV8sIHNlbGYuX19tYXhoZWFkZXJsZW4pCiAgICAgICAgICAgICBnKHBhcnQsIHVuaXhmcm9tPTApCkBAIC0zNjUsNyArMzgzLDcgQEAKIAogDAogIyBIZWxwZXIKLWRlZiBfbWFrZV9ib3VuZGFyeShzZWxmLCB0ZXh0PU5vbmUpOgorZGVmIF9tYWtlX2JvdW5kYXJ5KHRleHQ9Tm9uZSk6CiAgICAgIyBDcmFmdCBhIHJhbmRvbSBib3VuZGFyeS4gIElmIHRleHQgaXMgZ2l2ZW4sIGVuc3VyZSB0aGF0IHRoZSBjaG9zZW4KICAgICAjIGJvdW5kYXJ5IGRvZXNuJ3QgYXBwZWFyIGluIHRoZSB0ZXh0LgogICAgIGJvdW5kYXJ5ID0gKCc9JyAqIDE1KSArIHJlcHIocmFuZG9tLnJhbmRvbSgpKS5zcGxpdCgnLicpWzFdICsgJz09JwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0hlYWRlci5weSBiL0xpYi9lbWFpbC9IZWFkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3Yjk3OAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9IZWFkZXIucHkKQEAgLTAsMCArMSwyMTAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogY2hlQGRlYmlhbi5vcmcgKEJlbiBHZXJ0emZpZWxkKQorCisiIiJIZWFkZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZ1bmN0aW9uYWxpdHkuIiIiCisKK2ltcG9ydCByZQoraW1wb3J0IGVtYWlsLnF1b3ByaU1JTUUKK2ltcG9ydCBlbWFpbC5iYXNlNjRNSU1FCitmcm9tIGVtYWlsLkNoYXJzZXQgaW1wb3J0IENoYXJzZXQKKworQ1JMRlNQQUNFID0gJ1xyXG4gJworQ1JMRiA9ICdcclxuJworTkxTUEFDRSA9ICdcbiAnCisKK01BWExJTkVMRU4gPSA3NgorCitFTkNPREUgPSAxCitERUNPREUgPSAyCisKKyMgTWF0Y2ggZW5jb2RlZC13b3JkIHN0cmluZ3MgaW4gdGhlIGZvcm0gPT9jaGFyc2V0P3E/SGVsbG9fV29ybGQ/PQorZWNyZSA9IHJlLmNvbXBpbGUocicnJworICA9XD8gICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID0/CisgICg/UDxjaGFyc2V0PlteP10qPykgICAjIG5vbi1ncmVlZHkgdXAgdG8gdGhlIG5leHQgPyBpcyB0aGUgY2hhcnNldAorICBcPyAgICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID8KKyAgKD9QPGVuY29kaW5nPltxYl0pICAgICMgZWl0aGVyIGEgInEiIG9yIGEgImIiLCBjYXNlIGluc2Vuc2l0aXZlCisgIFw/ICAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPworICAoP1A8ZW5jb2RlZD4uKj8pICAgICAgIyBub24tZ3JlZWR5IHVwIHRvIHRoZSBuZXh0ID89IGlzIHRoZSBlbmNvZGVkIHN0cmluZworICBcPz0gICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID89CisgICcnJywgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCisKKworDAorIyBIZWxwZXJzCitfbWF4X2FwcGVuZCA9IGVtYWlsLnF1b3ByaU1JTUUuX21heF9hcHBlbmQKKworCisMCitkZWYgZGVjb2RlX2hlYWRlcihoZWFkZXIpOgorICAgICIiIkRlY29kZSBhIG1lc3NhZ2UgaGVhZGVyIHZhbHVlIHdpdGhvdXQgY29udmVydGluZyBjaGFyc2V0LgorCisgICAgUmV0dXJucyBhIGxpc3Qgb2YgKGRlY29kZWRfc3RyaW5nLCBjaGFyc2V0KSBwYWlycyBjb250YWluaW5nIGVhY2ggb2YgdGhlCisgICAgZGVjb2RlZCBwYXJ0cyBvZiB0aGUgaGVhZGVyLiAgQ2hhcnNldCBpcyBOb25lIGZvciBub24tZW5jb2RlZCBwYXJ0cyBvZiB0aGUKKyAgICBoZWFkZXIsIG90aGVyd2lzZSBhIGxvd2VyLWNhc2Ugc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlcgorICAgIHNldCBzcGVjaWZpZWQgaW4gdGhlIGVuY29kZWQgc3RyaW5nLgorICAgICIiIgorICAgICMgSWYgbm8gZW5jb2RpbmcsIGp1c3QgcmV0dXJuIHRoZSBoZWFkZXIKKyAgICBoZWFkZXIgPSBzdHIoaGVhZGVyKQorICAgIGlmIG5vdCBlY3JlLnNlYXJjaChoZWFkZXIpOgorICAgICAgICByZXR1cm4gWyhoZWFkZXIsIE5vbmUpXQorCisgICAgZGVjb2RlZCA9IFtdCisgICAgZGVjID0gJycKKyAgICBmb3IgbGluZSBpbiBoZWFkZXIuc3BsaXRsaW5lcygpOgorICAgICAgICAjIFRoaXMgbGluZSBtaWdodCBub3QgaGF2ZSBhbiBlbmNvZGluZyBpbiBpdAorICAgICAgICBpZiBub3QgZWNyZS5zZWFyY2gobGluZSk6CisgICAgICAgICAgICBkZWNvZGVkLmFwcGVuZCgobGluZSwgTm9uZSkpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAKKyAgICAgICAgcGFydHMgPSBlY3JlLnNwbGl0KGxpbmUpCisgICAgICAgIHdoaWxlIHBhcnRzOgorICAgICAgICAgICAgdW5lbmMgPSBwYXJ0cy5wb3AoMCkuc3RyaXAoKQorICAgICAgICAgICAgaWYgdW5lbmM6CisgICAgICAgICAgICAgICAgIyBTaG91bGQgd2UgY29udGludWUgYSBsb25nIGxpbmU/CisgICAgICAgICAgICAgICAgaWYgZGVjb2RlZCBhbmQgZGVjb2RlZFstMV1bMV0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFstMV0gPSAoZGVjb2RlZFstMV1bMF0gKyBkZWMsIE5vbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZC5hcHBlbmQoKHVuZW5jLCBOb25lKSkKKyAgICAgICAgICAgIGlmIHBhcnRzOgorICAgICAgICAgICAgICAgIGNoYXJzZXQsIGVuY29kaW5nID0gW3MubG93ZXIoKSBmb3IgcyBpbiBwYXJ0c1swOjJdXQorICAgICAgICAgICAgICAgIGVuY29kZWQgPSBwYXJ0c1syXQorICAgICAgICAgICAgICAgIGRlYyA9ICcnCisgICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgPT0gJ3EnOgorICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9kZWNvZGUoZW5jb2RlZCkKKyAgICAgICAgICAgICAgICBlbGlmIGVuY29kaW5nID09ICdiJzoKKyAgICAgICAgICAgICAgICAgICAgZGVjID0gZW1haWwuYmFzZTY0TUlNRS5kZWNvZGUoZW5jb2RlZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbmNvZGVkCisKKyAgICAgICAgICAgICAgICBpZiBkZWNvZGVkIGFuZCBkZWNvZGVkWy0xXVsxXSA9PSBjaGFyc2V0OgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkWy0xXSA9IChkZWNvZGVkWy0xXVswXSArIGRlYywgZGVjb2RlZFstMV1bMV0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZC5hcHBlbmQoKGRlYywgY2hhcnNldCkpCisgICAgICAgICAgICBkZWwgcGFydHNbMDozXQorICAgIHJldHVybiBkZWNvZGVkCisKKworDAorY2xhc3MgSGVhZGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzLCBjaGFyc2V0PU5vbmUsIG1heGxpbmVsZW49TUFYTElORUxFTiwKKyAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9Tm9uZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIE1JTUUtY29tcGxpYW50IGhlYWRlciB0aGF0IGNhbiBjb250YWluIG1hbnkgbGFuZ3VhZ2VzLgorCisgICAgICAgIFNwZWNpZnkgdGhlIGluaXRpYWwgaGVhZGVyIHZhbHVlIGluIHMuICBTcGVjaWZ5IGl0cyBjaGFyYWN0ZXIgc2V0IGFzIGEKKyAgICAgICAgQ2hhcnNldCBvYmplY3QgaW4gdGhlIGNoYXJzZXQgYXJndW1lbnQuICBJZiBub25lLCBhIGRlZmF1bHQgQ2hhcnNldAorICAgICAgICBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisKKyAgICAgICAgWW91IGNhbiBsYXRlciBhcHBlbmQgdG8gdGhlIGhlYWRlciB3aXRoIGFwcGVuZChzLCBjaGFyc2V0KSBiZWxvdzsKKyAgICAgICAgY2hhcnNldCBkb2VzIG5vdCBoYXZlIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgaW5pdGlhbGx5IHNwZWNpZmllZAorICAgICAgICBoZXJlLiAgSW4gZmFjdCwgaXQncyBvcHRpb25hbCwgYW5kIGlmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlCisgICAgICAgIGNoYXJzZXQgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKworICAgICAgICBUaGUgbWF4aW11bSBsaW5lIGxlbmd0aCBjYW4gZWl0aGVyIGJlIHNwZWNpZmllZCBieSBtYXhsaW5lbGVuLCBvciB5b3UKKyAgICAgICAgY2FuIHBhc3MgaW4gdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWVsZCAoZS5nLiAiU3ViamVjdCIpIHRvIGxldCB0aGlzCisgICAgICAgIGNsYXNzIGd1ZXNzIHRoZSBiZXN0IGxpbmUgbGVuZ3RoIHRvIHVzZSB0byBwcmV2ZW50IHdyYXBwaW5nLiAgVGhlCisgICAgICAgIGRlZmF1bHQgbWF4bGluZWxlbiBpcyA3Ni4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNoYXJzZXQgaXMgTm9uZToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCkKKyAgICAgICAgc2VsZi5fY2hhcnNldCA9IGNoYXJzZXQKKyAgICAgICAgIyBCQVc6IEkgYmVsaWV2ZSBgY2h1bmtzJyBhbmQgYG1heGxpbmVsZW4nIHNob3VsZCBiZSBub24tcHVibGljLgorICAgICAgICBzZWxmLl9jaHVua3MgPSBbXQorICAgICAgICBzZWxmLmFwcGVuZChzLCBjaGFyc2V0KQorICAgICAgICBzZWxmLl9tYXhsaW5lbGVuID0gbWF4bGluZWxlbgorICAgICAgICBpZiBoZWFkZXJfbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZ3Vlc3NfbWF4bGluZWxlbihoZWFkZXJfbmFtZSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJBIHN5bm9ueW0gZm9yIHNlbGYuZW5jb2RlKCkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVuY29kZSgpCisKKyAgICBkZWYgZ3Vlc3NfbWF4bGluZWxlbihzZWxmLCBzPU5vbmUpOgorICAgICAgICAiIiJHdWVzcyB0aGUgbWF4aW11bSBsZW5ndGggdG8gbWFrZSBlYWNoIGhlYWRlciBsaW5lLgorCisgICAgICAgIEdpdmVuIGEgaGVhZGVyIG5hbWUgKGUuZy4gIlN1YmplY3QiKSwgc2V0IHRoaXMgaGVhZGVyJ3MgbWF4aW11bSBsaW5lCisgICAgICAgIGxlbmd0aCB0byBhbiBhcHByb3ByaWF0ZSBsZW5ndGggdG8gYXZvaWQgbGluZSB3cmFwcGluZy4gIElmIHMgaXMgbm90CisgICAgICAgIGdpdmVuLCByZXR1cm4gdGhlIHByZXZpb3VzIG1heGltdW0gbGluZSBsZW5ndGggYW5kIGRvbid0IHNldCBpdC4KKworICAgICAgICBSZXR1cm5zIHRoZSBuZXcgbWF4aW11bSBsaW5lIGxlbmd0aC4KKyAgICAgICAgIiIiCisgICAgICAgICMgQkFXOiBpcyB0aGlzIHNlbWFudGljIG5lY2Vzc2FyeT8KKyAgICAgICAgaWYgcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX21heGxpbmVsZW4gPSBNQVhMSU5FTEVOIC0gbGVuKHMpIC0gMgorICAgICAgICByZXR1cm4gc2VsZi5fbWF4bGluZWxlbgorCisgICAgZGVmIGFwcGVuZChzZWxmLCBzLCBjaGFyc2V0PU5vbmUpOgorICAgICAgICAiIiJBcHBlbmQgc3RyaW5nIHMgd2l0aCBDaGFyc2V0IGNoYXJzZXQgdG8gdGhlIE1JTUUgaGVhZGVyLgorCisgICAgICAgIGNoYXJzZXQgZGVmYXVsdHMgdG8gdGhlIG9uZSBnaXZlbiBpbiB0aGUgY2xhc3MgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorICAgICAgICBpZiBjaGFyc2V0IGlzIE5vbmU6CisgICAgICAgICAgICBjaGFyc2V0ID0gc2VsZi5fY2hhcnNldAorICAgICAgICBzZWxmLl9jaHVua3MuYXBwZW5kKChzLCBjaGFyc2V0KSkKKyAgICAgICAgCisgICAgZGVmIF9zcGxpdChzZWxmLCBzLCBjaGFyc2V0KToKKyAgICAgICAgIyBTcGxpdCB1cCBhIGhlYWRlciBzYWZlbHkgZm9yIHVzZSB3aXRoIGVuY29kZV9jaHVua3MuICBCQVc6IHRoaXMKKyAgICAgICAgIyBhcHBlYXJzIHRvIGJlIGEgcHJpdmF0ZSBjb252ZW5pZW5jZSBtZXRob2QuCisgICAgICAgIHNwbGl0dGFibGUgPSBjaGFyc2V0LnRvX3NwbGl0dGFibGUocykKKyAgICAgICAgZW5jb2RlZCA9IGNoYXJzZXQuZnJvbV9zcGxpdHRhYmxlKHNwbGl0dGFibGUpCisgICAgICAgIAorICAgICAgICBpZiBjaGFyc2V0LmVuY29kZWRfaGVhZGVyX2xlbihlbmNvZGVkKSA8IHNlbGYuX21heGxpbmVsZW46CisgICAgICAgICAgICByZXR1cm4gWyhlbmNvZGVkLCBjaGFyc2V0KV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRGl2aWRlIGFuZCBjb25xdWVyLiAgQkFXOiBoYWxmd2F5IGRlcGVuZHMgb24gaW50ZWdlciBkaXZpc2lvbi4KKyAgICAgICAgICAgICMgV2hlbiBwb3J0aW5nIHRvIFB5dGhvbiAyLjIsIHVzZSB0aGUgLy8gb3BlcmF0b3IuCisgICAgICAgICAgICBoYWxmd2F5ID0gbGVuKHNwbGl0dGFibGUpIC8vIDIKKyAgICAgICAgICAgIGZpcnN0ID0gY2hhcnNldC5mcm9tX3NwbGl0dGFibGUoc3BsaXR0YWJsZVs6aGFsZndheV0sIDApCisgICAgICAgICAgICBsYXN0ID0gY2hhcnNldC5mcm9tX3NwbGl0dGFibGUoc3BsaXR0YWJsZVtoYWxmd2F5Ol0sIDApCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3BsaXQoZmlyc3QsIGNoYXJzZXQpICsgc2VsZi5fc3BsaXQobGFzdCwgY2hhcnNldCkKKworICAgIGRlZiBlbmNvZGUoc2VsZik6CisgICAgICAgICIiIkVuY29kZSBhIG1lc3NhZ2UgaGVhZGVyLCBwb3NzaWJseSBjb252ZXJ0aW5nIGNoYXJzZXQgYW5kIGVuY29kaW5nLgorCisgICAgICAgIFRoZXJlIGFyZSBtYW55IGlzc3VlcyBpbnZvbHZlZCBpbiBjb252ZXJ0aW5nIGEgZ2l2ZW4gc3RyaW5nIGZvciB1c2UgaW4KKyAgICAgICAgYW4gZW1haWwgaGVhZGVyLiAgT25seSBjZXJ0YWluIGNoYXJhY3RlciBzZXRzIGFyZSByZWFkYWJsZSBpbiBtb3N0CisgICAgICAgIGVtYWlsIGNsaWVudHMsIGFuZCBhcyBoZWFkZXIgc3RyaW5ncyBjYW4gb25seSBjb250YWluIGEgc3Vic2V0IG9mCisgICAgICAgIDctYml0IEFTQ0lJLCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gcHJvcGVybHkgY29udmVydCBhbmQgZW5jb2RlICh3aXRoCisgICAgICAgIEJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlKSBoZWFkZXIgc3RyaW5ncy4gIEluIGFkZGl0aW9uLCB0aGVyZSBpcyBhCisgICAgICAgIDc1LWNoYXJhY3RlciBsZW5ndGggbGltaXQgb24gYW55IGdpdmVuIGVuY29kZWQgaGVhZGVyIGZpZWxkLCBzbworICAgICAgICBsaW5lLXdyYXBwaW5nIG11c3QgYmUgcGVyZm9ybWVkLCBldmVuIHdpdGggZG91YmxlLWJ5dGUgY2hhcmFjdGVyIHNldHMuCisgICAgICAgIAorICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIGl0cyBiZXN0IHRvIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0aGUgY29ycmVjdAorICAgICAgICBjaGFyYWN0ZXIgc2V0IHVzZWQgaW4gZW1haWwsIGFuZCBlbmNvZGUgYW5kIGxpbmUgd3JhcCBpdCBzYWZlbHkgd2l0aAorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgc2NoZW1lIGZvciB0aGF0IGNoYXJhY3RlciBzZXQuCisKKyAgICAgICAgSWYgdGhlIGdpdmVuIGNoYXJzZXQgaXMgbm90IGtub3duIG9yIGFuIGVycm9yIG9jY3VycyBkdXJpbmcKKyAgICAgICAgY29udmVyc2lvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaGVhZGVyIHVudG91Y2hlZC4KKyAgICAgICAgIiIiCisgICAgICAgIG5ld2NodW5rcyA9IFtdCisgICAgICAgIGZvciBzLCBjaGFyc2V0IGluIHNlbGYuX2NodW5rczoKKyAgICAgICAgICAgIG5ld2NodW5rcyArPSBzZWxmLl9zcGxpdChzLCBjaGFyc2V0KQorICAgICAgICBzZWxmLl9jaHVua3MgPSBuZXdjaHVua3MKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlX2NodW5rcygpCisKKyAgICBkZWYgZW5jb2RlX2NodW5rcyhzZWxmKToKKyAgICAgICAgIiIiTUlNRS1lbmNvZGUgYSBoZWFkZXIgd2l0aCBtYW55IGRpZmZlcmVudCBjaGFyc2V0cyBhbmQvb3IgZW5jb2RpbmdzLgorCisgICAgICAgIEdpdmVuIGEgbGlzdCBvZiBwYWlycyAoc3RyaW5nLCBjaGFyc2V0KSwgcmV0dXJuIGEgTUlNRS1lbmNvZGVkIHN0cmluZworICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGluIGEgaGVhZGVyIGZpZWxkLiAgRWFjaCBwYWlyIG1heSBoYXZlIGRpZmZlcmVudAorICAgICAgICBjaGFyc2V0cyBhbmQvb3IgZW5jb2RpbmdzLCBhbmQgdGhlIHJlc3VsdGluZyBoZWFkZXIgd2lsbCBhY2N1cmF0ZWx5CisgICAgICAgIHJlZmxlY3QgZWFjaCBzZXR0aW5nLgorCisgICAgICAgIEVhY2ggZW5jb2RpbmcgY2FuIGJlIGVtYWlsLlV0aWxzLlFQIChxdW90ZWQtcHJpbnRhYmxlLCBmb3IgQVNDSUktbGlrZQorICAgICAgICBjaGFyYWN0ZXIgc2V0cyBsaWtlIGlzby04ODU5LTEpLCBlbWFpbC5VdGlscy5CQVNFNjQgKEJhc2U2NCwgZm9yCisgICAgICAgIG5vbi1BU0NJSSBsaWtlIGNoYXJhY3RlciBzZXRzIGxpa2UgS09JOC1SIGFuZCBpc28tMjAyMi1qcCksIG9yIE5vbmUKKyAgICAgICAgKG5vIGVuY29kaW5nKS4KKworICAgICAgICBFYWNoIHBhaXIgd2lsbCBiZSByZXByZXNlbnRlZCBvbiBhIHNlcGFyYXRlIGxpbmU7IHRoZSByZXN1bHRpbmcgc3RyaW5nCisgICAgICAgIHdpbGwgYmUgaW4gdGhlIGZvcm1hdDoKKworICAgICAgICAiPT9jaGFyc2V0MT9xP01hcj1FRGFfR29uej1FMWxlel9BbG9uc28/PVxuCisgICAgICAgICAgPT9jaGFyc2V0Mj9iP1N2eHlaMlZ1SUVMMmFXNW4/PSIKKyAgICAgICAgIiIiCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIGZvciBoZWFkZXIsIGNoYXJzZXQgaW4gc2VsZi5fY2h1bmtzOgorICAgICAgICAgICAgaWYgY2hhcnNldCBpcyBOb25lOgorICAgICAgICAgICAgICAgIF9tYXhfYXBwZW5kKGNodW5rcywgaGVhZGVyLCBzZWxmLl9tYXhsaW5lbGVuLCAnICcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF9tYXhfYXBwZW5kKGNodW5rcywgY2hhcnNldC5oZWFkZXJfZW5jb2RlKGhlYWRlciwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWF4bGluZWxlbiwgJyAnKQorICAgICAgICByZXR1cm4gTkxTUEFDRS5qb2luKGNodW5rcykKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9JdGVyYXRvcnMucHkgYi9MaWIvZW1haWwvSXRlcmF0b3JzLnB5CmluZGV4IGE2NDQ5NWQuLjUxNWJhYzkgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9JdGVyYXRvcnMucHkKKysrIGIvTGliL2VtYWlsL0l0ZXJhdG9ycy5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogYmFycnlAem9wZS5jb20gKEJhcnJ5IFdhcnNhdykKIAogIiIiVmFyaW91cyB0eXBlcyBvZiB1c2VmdWwgaXRlcmF0b3JzIGFuZCBnZW5lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVCYXNlLnB5IGIvTGliL2VtYWlsL01JTUVCYXNlLnB5CmluZGV4IDMzMjE2ZjYuLjI4ODE2ZTggMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FQmFzZS5weQorKysgYi9MaWIvZW1haWwvTUlNRUJhc2UucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IGJhcnJ5QHpvcGUuY29tIChCYXJyeSBXYXJzYXcpCiAKICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgc3BlY2lhbGl6YXRpb25zLgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVJbWFnZS5weSBiL0xpYi9lbWFpbC9NSU1FSW1hZ2UucHkKaW5kZXggOTYzZGEyMy4uZjBlNzkzMWEgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FSW1hZ2UucHkKKysrIGIvTGliL2VtYWlsL01JTUVJbWFnZS5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogYmFycnlAem9wZS5jb20gKEJhcnJ5IFdhcnNhdykKIAogIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50cy4KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FTWVzc2FnZS5weSBiL0xpYi9lbWFpbC9NSU1FTWVzc2FnZS5weQppbmRleCBmYzRiMmM2Li44OWRhOTI1IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRU1lc3NhZ2UucHkKKysrIGIvTGliL2VtYWlsL01JTUVNZXNzYWdlLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBiYXJyeUB6b3BlLmNvbSAoQmFycnkgV2Fyc2F3KQogCiAiIiJDbGFzcyByZXByZXNlbnRpbmcgbWVzc2FnZS8qIE1JTUUgZG9jdW1lbnRzLgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVUZXh0LnB5IGIvTGliL2VtYWlsL01JTUVUZXh0LnB5CmluZGV4IGNjY2U5ZmIuLjg2NjlkMjggMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FVGV4dC5weQorKysgYi9MaWIvZW1haWwvTUlNRVRleHQucHkKQEAgLTEsOSArMSwxMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBiYXJyeUB6b3BlLmNvbSAoQmFycnkgV2Fyc2F3KQogCiAiIiJDbGFzcyByZXByZXNlbnRpbmcgdGV4dC8qIHR5cGUgTUlNRSBkb2N1bWVudHMuCiAiIiIKIAoraW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgTUlNRUJhc2UKIGZyb20gRW5jb2RlcnMgaW1wb3J0IGVuY29kZV83b3I4Yml0CiAKQEAgLTEzLDcgKzE0LDcgQEAKICAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyB0ZXh0LyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfdGV4dCwgX3N1YnR5cGU9J3BsYWluJywgX2NoYXJzZXQ9J3VzLWFzY2lpJywKLSAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW5jb2RlXzdvcjhiaXQpOgorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1Ob25lKToKICAgICAgICAgIiIiQ3JlYXRlIGEgdGV4dC8qIHR5cGUgTUlNRSBkb2N1bWVudC4KIAogICAgICAgICBfdGV4dCBpcyB0aGUgc3RyaW5nIGZvciB0aGlzIG1lc3NhZ2Ugb2JqZWN0LiAgSWYgdGhlIHRleHQgZG9lcyBub3QgZW5kCkBAIC0yMiwyMCArMjMsMjYgQEAKICAgICAgICAgX3N1YnR5cGUgaXMgdGhlIE1JTUUgc3ViIGNvbnRlbnQgdHlwZSwgZGVmYXVsdGluZyB0byAicGxhaW4iLgogCiAgICAgICAgIF9jaGFyc2V0IGlzIHRoZSBjaGFyYWN0ZXIgc2V0IHBhcmFtZXRlciBhZGRlZCB0byB0aGUgQ29udGVudC1UeXBlOgotICAgICAgICBoZWFkZXIuICBUaGlzIGRlZmF1bHRzIHRvICJ1cy1hc2NpaSIuCisgICAgICAgIGhlYWRlci4gIFRoaXMgZGVmYXVsdHMgdG8gInVzLWFzY2lpIi4gIE5vdGUgdGhhdCBhcyBhIHNpZGUtZWZmZWN0LCB0aGUKKyAgICAgICAgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogaGVhZGVyIHdpbGwgYWxzbyBiZSBzZXQuCiAKLSAgICAgICAgX2VuY29kZXIgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBmb3IKLSAgICAgICAgdHJhbnNwb3J0IG9mIHRoZSB0ZXh0IGRhdGEuICBJdCB0YWtlcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIHRoaXMKLSAgICAgICAgVGV4dCBpbnN0YW5jZS4gIEl0IHNob3VsZCB1c2UgZ2V0X3BheWxvYWQoKSBhbmQgc2V0X3BheWxvYWQoKSB0bwotICAgICAgICBjaGFuZ2UgdGhlIHBheWxvYWQgdG8gdGhlIGVuY29kZWQgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZCBhbnkKLSAgICAgICAgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogb3Igb3RoZXIgaGVhZGVycyB0byB0aGUgbWVzc2FnZSBhcwotICAgICAgICBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBkb2Vzbid0IGFjdHVhbGx5IG1vZGlmeSB0aGUgcGF5bG9hZCwKLSAgICAgICAgYnV0IGl0IGRvZXMgc2V0IENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHRvIGVpdGhlciBgN2JpdCcgb3IgYDhiaXQnCi0gICAgICAgIGFzIGFwcHJvcHJpYXRlLgorICAgICAgICBUaGUgdXNlIG9mIHRoZSBfZW5jb2RlciBpcyBkZXByZWNhdGVkLiAgVGhlIGVuY29kaW5nIG9mIHRoZSBwYXlsb2FkLAorICAgICAgICBhbmQgdGhlIHNldHRpbmcgb2YgdGhlIGNoYXJhY3RlciBzZXQgcGFyYW1ldGVyIG5vdyBoYXBwZW5zIGltcGxpY2l0bHkKKyAgICAgICAgYmFzZWQgb24gdGhlIF9jaGFyc2V0IGFyZ3VtZW50LiAgSWYgX2VuY29kZXIgaXMgc3VwcGxpZWQsIHRoZW4gYQorICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcgaXMgdXNlZCwgYW5kIHRoZSBfZW5jb2RlciBmdW5jdGlvbmFsaXR5IG1heQorICAgICAgICBvdmVycmlkZSBhbnkgaGVhZGVyIHNldHRpbmdzIGluZGljYXRlZCBieSBfY2hhcnNldC4gIFRoaXMgaXMgcHJvYmFibHkKKyAgICAgICAgbm90IHdoYXQgeW91IHdhbnQuCiAgICAgICAgICIiIgogICAgICAgICBNSU1FQmFzZS5NSU1FQmFzZS5fX2luaXRfXyhzZWxmLCAndGV4dCcsIF9zdWJ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnsnY2hhcnNldCc6IF9jaGFyc2V0fSkKICAgICAgICAgaWYgX3RleHQgYW5kIF90ZXh0Wy0xXSA8PiAnXG4nOgogICAgICAgICAgICAgX3RleHQgKz0gJ1xuJwotICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF90ZXh0KQotICAgICAgICBfZW5jb2RlcihzZWxmKQorICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF90ZXh0LCBfY2hhcnNldCkKKyAgICAgICAgaWYgX2VuY29kZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdfZW5jb2RlciBhcmd1bWVudCBpcyBvYnNvbGV0ZS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgICAgICAgICAjIEJlY2F1c2Ugc2V0X3BheWxvYWQoKSB3aXRoIGEgX2NoYXJzZXQgd2lsbCBzZXQgaXRzIG93bgorICAgICAgICAgICAgIyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBoZWFkZXIsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZQorICAgICAgICAgICAgIyBleGlzdGluZyBvbmUgb3Igd2lsbCBlbmQgdXAgd2l0aCB0d28gb2YgdGhlbS4gOigKKyAgICAgICAgICAgIGRlbCBzZWxmWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10KKyAgICAgICAgICAgIF9lbmNvZGVyKHNlbGYpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTWVzc2FnZS5weSBiL0xpYi9lbWFpbC9NZXNzYWdlLnB5CmluZGV4IDkxOTMxYTEuLjcxZDEwYzQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NZXNzYWdlLnB5CisrKyBiL0xpYi9lbWFpbC9NZXNzYWdlLnB5CkBAIC0xLDIzICsxLDQ3IEBACi0jIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IGJhcnJ5QHpvcGUuY29tIChCYXJyeSBXYXJzYXcpCiAKICIiIkJhc2ljIG1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUgZW1haWwgcGFja2FnZSBvYmplY3QgbW9kZWwuCiAiIiIKIAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzCi0KIGltcG9ydCByZQotaW1wb3J0IGJhc2U2NAotaW1wb3J0IHF1b3ByaQoraW1wb3J0IHdhcm5pbmdzCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gdHlwZXMgaW1wb3J0IExpc3RUeXBlCitmcm9tIHR5cGVzIGltcG9ydCBMaXN0VHlwZSwgU3RyaW5nVHlwZQogCiAjIEludHJhcGFja2FnZSBpbXBvcnRzCiBpbXBvcnQgRXJyb3JzCiBpbXBvcnQgVXRpbHMKK2ltcG9ydCBDaGFyc2V0CiAKIFNFTUlTUEFDRSA9ICc7ICcKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBzcGxpdCBoZWFkZXIgcGFyYW1ldGVycy4gIEJBVzogdGhpcyBtYXkgYmUgdG9vCisjIHNpbXBsZS4gIEl0IGlzbid0IHN0cmljdGx5IFJGQyAyMDQ1IChzZWN0aW9uIDUuMSkgY29tcGxpYW50LCBidXQgaXQgY2F0Y2hlcworIyBtb3N0IGhlYWRlcnMgZm91bmQgaW4gdGhlIHdpbGQuICBXZSBtYXkgZXZlbnR1YWxseSBuZWVkIGEgZnVsbCBmbGVkZ2VkCisjIHBhcnNlciBldmVudHVhbGx5LgogcGFyYW1yZSA9IHJlLmNvbXBpbGUocidccyo7XHMqJykKKyMgUmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBgc3BlY2lhbCcgY2hhcmFjdGVycyBpbiBwYXJhbWV0ZXJzLCB0aGUKKyMgZXhpc3RhbmNlIG9mIHdoaWNoIGZvcmNlIHF1b3Rpbmcgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZS4KK3RzcGVjaWFscyA9IHJlLmNvbXBpbGUocidbIFwoXCk8PkAsOzpcXCIvXFtcXVw/PV0nKQorCisKKwwKKyMgSGVscGVyIGZ1bmN0aW9uCitkZWYgX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZT1Ob25lLCBxdW90ZT0xKToKKyAgICAiIiJDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBmb3JtYXQgYW5kIHJldHVybiBhIGtleT12YWx1ZSBwYWlyLgorCisgICAgV2lsbCBxdW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkIG9yIGlmIHF1b3RlIGlzIHRydWUuCisgICAgIiIiCisgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIGxlbih2YWx1ZSkgPiAwOgorICAgICAgICAjIEJBVzogUGxlYXNlIGNoZWNrIHRoaXMuICBJIHRoaW5rIHRoYXQgaWYgcXVvdGUgaXMgc2V0IGl0IHNob3VsZAorICAgICAgICAjIGZvcmNlIHF1b3RpbmcgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LgorICAgICAgICBpZiBxdW90ZSBvciB0c3BlY2lhbHMuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiAnJXM9IiVzIicgJSAocGFyYW0sIFV0aWxzLnF1b3RlKHZhbHVlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJXM9JXMnICUgKHBhcmFtLCB2YWx1ZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcGFyYW0KIAogCiAMCkBAIC0zOSw2ICs2Myw3IEBACiAgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBbXQogICAgICAgICBzZWxmLl91bml4ZnJvbSA9IE5vbmUKICAgICAgICAgc2VsZi5fcGF5bG9hZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2hhcnNldCA9IE5vbmUKICAgICAgICAgIyBEZWZhdWx0cyBmb3IgbXVsdGlwYXJ0IG1lc3NhZ2VzCiAgICAgICAgIHNlbGYucHJlYW1ibGUgPSBzZWxmLmVwaWxvZ3VlID0gTm9uZQogCkBAIC04Myw2ICsxMDgsOCBAQAogICAgICAgICBJZiB0aGUgY3VycmVudCBwYXlsb2FkIGlzIGVtcHR5LCB0aGVuIHRoZSBjdXJyZW50IHBheWxvYWQgd2lsbCBiZSBtYWRlCiAgICAgICAgIGEgc2NhbGFyLCBzZXQgdG8gdGhlIGdpdmVuIHZhbHVlLgogICAgICAgICAiIiIKKyAgICAgICAgd2FybmluZ3Mud2FybignYWRkX3BheWxvYWQoKSBpcyBkZXByZWNhdGVkLCB1c2UgYXR0YWNoKCkgaW5zdGVhZC4nLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKICAgICAgICAgaWYgc2VsZi5fcGF5bG9hZCBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5fcGF5bG9hZCA9IHBheWxvYWQKICAgICAgICAgZWxpZiB0eXBlKHNlbGYuX3BheWxvYWQpIGlzIExpc3RUeXBlOgpAQCAtOTMsOCArMTIwLDE4IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLl9wYXlsb2FkID0gW3NlbGYuX3BheWxvYWQsIHBheWxvYWRdCiAKLSAgICAjIEEgdXNlZnVsIHN5bm9ueW0KLSAgICBhdHRhY2ggPSBhZGRfcGF5bG9hZAorICAgIGRlZiBhdHRhY2goc2VsZiwgcGF5bG9hZCk6CisgICAgICAgICIiIkFkZCB0aGUgZ2l2ZW4gcGF5bG9hZCB0byB0aGUgY3VycmVudCBwYXlsb2FkLgorCisgICAgICAgIFRoZSBjdXJyZW50IHBheWxvYWQgd2lsbCBhbHdheXMgYmUgYSBsaXN0IG9mIG9iamVjdHMgYWZ0ZXIgdGhpcyBtZXRob2QKKyAgICAgICAgaXMgY2FsbGVkLiAgSWYgeW91IHdhbnQgdG8gc2V0IHRoZSBwYXlsb2FkIHRvIGEgc2NhbGFyIG9iamVjdAorICAgICAgICAoZS5nLiBiZWNhdXNlIHlvdSdyZSBhdHRhY2hpbmcgYSBtZXNzYWdlL3JmYzgyMiBzdWJwYXJ0KSwgdXNlCisgICAgICAgIHNldF9wYXlsb2FkKCkgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3BheWxvYWQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3BheWxvYWQgPSBbcGF5bG9hZF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3BheWxvYWQuYXBwZW5kKHBheWxvYWQpCiAKICAgICBkZWYgZ2V0X3BheWxvYWQoc2VsZiwgaT1Ob25lLCBkZWNvZGU9MCk6CiAgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBwYXlsb2FkIGV4YWN0bHkgYXMgaXMuCkBAIC0xMjgsMTAgKzE2NSw1OCBAQAogICAgICAgICByZXR1cm4gcGF5bG9hZAogCiAKLSAgICBkZWYgc2V0X3BheWxvYWQoc2VsZiwgcGF5bG9hZCk6Ci0gICAgICAgICIiIlNldCB0aGUgcGF5bG9hZCB0byB0aGUgZ2l2ZW4gdmFsdWUuIiIiCi0gICAgICAgIHNlbGYuX3BheWxvYWQgPSBwYXlsb2FkCisgICAgZGVmIHNldF9wYXlsb2FkKHNlbGYsIHBheWxvYWQsIGNoYXJzZXQ9Tm9uZSk6CisgICAgICAgICIiIlNldCB0aGUgcGF5bG9hZCB0byB0aGUgZ2l2ZW4gdmFsdWUuCiAKKyAgICAgICAgT3B0aW9uYWxseSBzZXQgdGhlIGNoYXJzZXQsIHdoaWNoIG11c3QgYmUgYSBDaGFyc2V0IGluc3RhbmNlLiIiIgorICAgICAgICBzZWxmLl9wYXlsb2FkID0gcGF5bG9hZAorICAgICAgICBpZiBjaGFyc2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zZXRfY2hhcnNldChjaGFyc2V0KQorCisgICAgZGVmIHNldF9jaGFyc2V0KHNlbGYsIGNoYXJzZXQpOgorICAgICAgICAiIiJTZXQgdGhlIGNoYXJzZXQgb2YgdGhlIHBheWxvYWQgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgc2V0LgorCisgICAgICAgIGNoYXJzZXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgQ2hhcnNldCBvYmplY3QuICBJZiBpdCBpcyBhIHN0cmluZywgaXQKKyAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBDaGFyc2V0IG9iamVjdCBieSBjYWxsaW5nIENoYXJzZXQncworICAgICAgICBjb25zdHJ1Y3Rvci4gIElmIGNoYXJzZXQgaXMgTm9uZSwgdGhlIGNoYXJzZXQgcGFyYW1ldGVyIHdpbGwgYmUKKyAgICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBDb250ZW50LVR5cGU6IGZpZWxkLiAgQW55dGhpbmcgZWxzZSB3aWxsIGdlbmVyYXRlIGEKKyAgICAgICAgVHlwZUVycm9yLgorCisgICAgICAgIFRoZSBtZXNzYWdlIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBhIHRleHQgbWVzc2FnZSBlbmNvZGVkIHdpdGgKKyAgICAgICAgY2hhcnNldC5pbnB1dF9jaGFyc2V0LiAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2hhcnNldC5vdXRwdXRfY2hhcnNldAorICAgICAgICBhbmQgZW5jb2RlZCBwcm9wZXJseSwgaWYgbmVlZGVkLCB3aGVuIGdlbmVyYXRpbmcgdGhlIHBsYWluIHRleHQKKyAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UuICBNSU1FIGhlYWRlcnMgKE1JTUUtVmVyc2lvbiwKKyAgICAgICAgQ29udGVudC1UeXBlLCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nKSB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNoYXJzZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVsX3BhcmFtKCdjaGFyc2V0JykKKyAgICAgICAgICAgIHNlbGYuX2NoYXJzZXQgPSBOb25lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShjaGFyc2V0LCBTdHJpbmdUeXBlKToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0LkNoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hhcnNldCwgQ2hhcnNldC5DaGFyc2V0KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgY2hhcnNldAorICAgICAgICAjIEJBVzogc2hvdWxkIHdlIGFjY2VwdCBzdHJpbmdzIHRoYXQgY2FuIHNlcnZlIGFzIGFyZ3VtZW50cyB0byB0aGUKKyAgICAgICAgIyBDaGFyc2V0IGNvbnN0cnVjdG9yPworICAgICAgICBzZWxmLl9jaGFyc2V0ID0gY2hhcnNldAorICAgICAgICBpZiBub3Qgc2VsZi5oYXNfa2V5KCdNSU1FLVZlcnNpb24nKToKKyAgICAgICAgICAgIHNlbGYuYWRkX2hlYWRlcignTUlNRS1WZXJzaW9uJywgJzEuMCcpCisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19rZXkoJ0NvbnRlbnQtVHlwZScpOgorICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD1jaGFyc2V0LmdldF9vdXRwdXRfY2hhcnNldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZXRfcGFyYW0oJ2NoYXJzZXQnLCBjaGFyc2V0LmdldF9vdXRwdXRfY2hhcnNldCgpKQorICAgICAgICBpZiBub3Qgc2VsZi5oYXNfa2V5KCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJyk6CisgICAgICAgICAgICBjdGUgPSBjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCkKKyAgICAgICAgICAgIGlmIGNhbGxhYmxlKGN0ZSk6CisgICAgICAgICAgICAgICAgY3RlKHNlbGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX2hlYWRlcignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsIGN0ZSkKKworICAgIGRlZiBnZXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBDaGFyc2V0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UncyBwYXlsb2FkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY2hhcnNldAorICAgICAgICAKICAgICAjCiAgICAgIyBNQVBQSU5HIElOVEVSRkFDRSAocGFydGlhbCkKICAgICAjCkBAIC0yNTcsNyArMzQyLDcgQEAKICAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKICAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoay5yZXBsYWNlKCdfJywgJy0nKSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKCclcz0iJXMiJyAlIChrLnJlcGxhY2UoJ18nLCAnLScpLCB2KSkKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoX2Zvcm1hdHBhcmFtKGsucmVwbGFjZSgnXycsICctJyksIHYpKQogICAgICAgICBpZiBfdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBwYXJ0cy5pbnNlcnQoMCwgX3ZhbHVlKQogICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgoX25hbWUsIFNFTUlTUEFDRS5qb2luKHBhcnRzKSkpCkBAIC0zMDgsNiArMzkzLDggQEAKICAgICAgICAgZm9yIHAgaW4gcGFyYW1yZS5zcGxpdCh2YWx1ZSk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgbmFtZSwgdmFsID0gcC5zcGxpdCgnPScsIDEpCisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucnN0cmlwKCkKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWwubHN0cmlwKCkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICMgTXVzdCBoYXZlIGJlZW4gYSBiYXJlIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgIG5hbWUgPSBwCkBAIC0zMTUsMjYgKzQwMiwyOSBAQAogICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgobmFtZSwgdmFsKSkKICAgICAgICAgcmV0dXJuIHBhcmFtcwogCi0gICAgZGVmIGdldF9wYXJhbXMoc2VsZiwgZmFpbG9iaj1Ob25lLCBoZWFkZXI9J2NvbnRlbnQtdHlwZScpOgorICAgIGRlZiBnZXRfcGFyYW1zKHNlbGYsIGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCB1bnF1b3RlPTEpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG1lc3NhZ2UncyBDb250ZW50LVR5cGU6IHBhcmFtZXRlcnMsIGFzIGEgbGlzdC4KIAogICAgICAgICBUaGUgZWxlbWVudHMgb2YgdGhlIHJldHVybmVkIGxpc3QgYXJlIDItdHVwbGVzIG9mIGtleS92YWx1ZSBwYWlycywgYXMKICAgICAgICAgc3BsaXQgb24gdGhlIGA9JyBzaWduLiAgVGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBgPScgaXMgdGhlIGtleSwKICAgICAgICAgd2hpbGUgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyB0aGUgdmFsdWUuICBJZiB0aGVyZSBpcyBubyBgPScgc2lnbiBpbgogICAgICAgICB0aGUgcGFyYW1ldGVyIHRoZSB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLiAgVGhlIHZhbHVlIGlzIGFsd2F5cwotICAgICAgICB1bnF1b3RlZC4KKyAgICAgICAgdW5xdW90ZWQsIHVubGVzcyB1bnF1b3RlIGlzIHNldCB0byBhIGZhbHNlIHZhbHVlLgogCiAgICAgICAgIE9wdGlvbmFsIGZhaWxvYmogaXMgdGhlIG9iamVjdCB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8gQ29udGVudC1UeXBlOgogICAgICAgICBoZWFkZXIuICBPcHRpb25hbCBoZWFkZXIgaXMgdGhlIGhlYWRlciB0byBzZWFyY2ggaW5zdGVhZCBvZgotICAgICAgICBDb250ZW50LVR5cGU6CisgICAgICAgIENvbnRlbnQtVHlwZTouCiAgICAgICAgICIiIgogICAgICAgICBtaXNzaW5nID0gW10KICAgICAgICAgcGFyYW1zID0gc2VsZi5fZ2V0X3BhcmFtc19wcmVzZXJ2ZShtaXNzaW5nLCBoZWFkZXIpCiAgICAgICAgIGlmIHBhcmFtcyBpcyBtaXNzaW5nOgogICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKLSAgICAgICAgcmV0dXJuIFsoaywgVXRpbHMudW5xdW90ZSh2KSkgZm9yIGssIHYgaW4gcGFyYW1zXQorICAgICAgICBpZiB1bnF1b3RlOgorICAgICAgICAgICAgcmV0dXJuIFsoaywgVXRpbHMudW5xdW90ZSh2KSkgZm9yIGssIHYgaW4gcGFyYW1zXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHBhcmFtcwogCi0gICAgZGVmIGdldF9wYXJhbShzZWxmLCBwYXJhbSwgZmFpbG9iaj1Ob25lLCBoZWFkZXI9J2NvbnRlbnQtdHlwZScpOgorICAgIGRlZiBnZXRfcGFyYW0oc2VsZiwgcGFyYW0sIGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCB1bnF1b3RlPTEpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHBhcmFtZXRlciB2YWx1ZSBpZiBmb3VuZCBpbiB0aGUgQ29udGVudC1UeXBlOiBoZWFkZXIuCiAKICAgICAgICAgT3B0aW9uYWwgZmFpbG9iaiBpcyB0aGUgb2JqZWN0IHRvIHJldHVybiBpZiB0aGVyZSBpcyBubyBDb250ZW50LVR5cGU6CkBAIC0zNDIsMTUgKzQzMiwxMTIgQEAKICAgICAgICAgQ29udGVudC1UeXBlOgogCiAgICAgICAgIFBhcmFtZXRlciBrZXlzIGFyZSBhbHdheXMgY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZWx5LiAgVmFsdWVzIGFyZQotICAgICAgICBhbHdheXMgdW5xdW90ZWQuCisgICAgICAgIGFsd2F5cyB1bnF1b3RlZCwgdW5sZXNzIHVucXVvdGUgaXMgc2V0IHRvIGEgZmFsc2UgdmFsdWUuCiAgICAgICAgICIiIgogICAgICAgICBpZiBub3Qgc2VsZi5oYXNfa2V5KGhlYWRlcik6CiAgICAgICAgICAgICByZXR1cm4gZmFpbG9iagogICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9nZXRfcGFyYW1zX3ByZXNlcnZlKGZhaWxvYmosIGhlYWRlcik6CiAgICAgICAgICAgICBpZiBrLmxvd2VyKCkgPT0gcGFyYW0ubG93ZXIoKToKLSAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMudW5xdW90ZSh2KQorICAgICAgICAgICAgICAgIGlmIHVucXVvdGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy51bnF1b3RlKHYpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYKICAgICAgICAgcmV0dXJuIGZhaWxvYmoKIAorICAgIGRlZiBzZXRfcGFyYW0oc2VsZiwgcGFyYW0sIHZhbHVlLCBoZWFkZXI9J0NvbnRlbnQtVHlwZScsIHJlcXVvdGU9MSk6CisgICAgICAgICIiIlNldCBhIHBhcmFtZXRlciBpbiB0aGUgQ29udGVudC1UeXBlOiBoZWFkZXIuCisKKyAgICAgICAgSWYgdGhlIHBhcmFtZXRlciBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgaGVhZGVyLCBpdHMgdmFsdWUgd2lsbCBiZQorICAgICAgICByZXBsYWNlZCB3aXRoIHRoZSBuZXcgdmFsdWUuCisKKyAgICAgICAgSWYgaGVhZGVyIGlzIENvbnRlbnQtVHlwZTogYW5kIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCBpbiB0aGlzCisgICAgICAgIG1lc3NhZ2UsIGl0IHdpbGwgYmUgc2V0IHRvICJ0ZXh0L3BsYWluIiBhbmQgdGhlIG5ldyBwYXJhbWV0ZXIgYW5kCisgICAgICAgIHZhbHVlIHdpbGwgYmUgYXBwZW5kZWQsIGFzIHBlciBSRkMgMjA0NS4KKworICAgICAgICBBbiBhbHRlcm5hdGUgaGVhZGVyIGNhbiBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBhcmd1bWVudCwgYW5kCisgICAgICAgIGFsbCBwYXJhbWV0ZXJzIHdpbGwgYmUgcXVvdGVkIGFzIGFwcHJvcHJpYXRlIHVubGVzcyByZXF1b3RlIGlzCisgICAgICAgIHNldCB0byBhIGZhbHNlIHZhbHVlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX2tleShoZWFkZXIpIGFuZCBoZWFkZXIubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgIGN0eXBlID0gJ3RleHQvcGxhaW4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdHlwZSA9IHNlbGYuZ2V0KGhlYWRlcikKKyAgICAgICAgaWYgbm90IHNlbGYuZ2V0X3BhcmFtKHBhcmFtLCBoZWFkZXI9aGVhZGVyKToKKyAgICAgICAgICAgIGlmIG5vdCBjdHlwZToKKyAgICAgICAgICAgICAgICBjdHlwZSA9IF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWUsIHJlcXVvdGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gU0VNSVNQQUNFLmpvaW4oCisgICAgICAgICAgICAgICAgICAgIFtjdHlwZSwgX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZSwgcmVxdW90ZSldKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3R5cGUgPSAnJworICAgICAgICAgICAgZm9yIG9sZF9wYXJhbSwgb2xkX3ZhbHVlIGluIHNlbGYuZ2V0X3BhcmFtcyhoZWFkZXI9aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1b3RlPXJlcXVvdGUpOgorICAgICAgICAgICAgICAgIGFwcGVuZF9wYXJhbSA9ICcnCisgICAgICAgICAgICAgICAgaWYgb2xkX3BhcmFtLmxvd2VyKCkgPT0gcGFyYW0ubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3BhcmFtID0gX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZSwgcmVxdW90ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRfcGFyYW0gPSBfZm9ybWF0cGFyYW0ob2xkX3BhcmFtLCBvbGRfdmFsdWUsIHJlcXVvdGUpCisgICAgICAgICAgICAgICAgaWYgbm90IGN0eXBlOgorICAgICAgICAgICAgICAgICAgICBjdHlwZSA9IGFwcGVuZF9wYXJhbQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGN0eXBlID0gU0VNSVNQQUNFLmpvaW4oW2N0eXBlLCBhcHBlbmRfcGFyYW1dKQorICAgICAgICBpZiBjdHlwZSA8PiBzZWxmLmdldChoZWFkZXIpOgorICAgICAgICAgICAgZGVsIHNlbGZbaGVhZGVyXQorICAgICAgICAgICAgc2VsZltoZWFkZXJdID0gY3R5cGUKKworICAgIGRlZiBkZWxfcGFyYW0oc2VsZiwgcGFyYW0sIGhlYWRlcj0nY29udGVudC10eXBlJywgcmVxdW90ZT0xKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBnaXZlbiBwYXJhbWV0ZXIgY29tcGxldGVseSBmcm9tIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIFRoZSBoZWFkZXIgd2lsbCBiZSByZS13cml0dGVuIGluIHBsYWNlIHdpdGhvdXQgcGFyYW0gb3IgaXRzIHZhbHVlLgorICAgICAgICBBbGwgdmFsdWVzIHdpbGwgYmUgcXVvdGVkIGFzIGFwcHJvcHJpYXRlIHVubGVzcyByZXF1b3RlIGlzIHNldCB0byBhCisgICAgICAgIGZhbHNlIHZhbHVlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX2tleShoZWFkZXIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5ld19jdHlwZSA9ICcnCisgICAgICAgIGZvciBwLCB2IGluIHNlbGYuZ2V0X3BhcmFtcyhoZWFkZXIsIHVucXVvdGU9cmVxdW90ZSk6CisgICAgICAgICAgICBpZiBwLmxvd2VyKCkgPD4gcGFyYW0ubG93ZXIoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgbmV3X2N0eXBlOgorICAgICAgICAgICAgICAgICAgICBuZXdfY3R5cGUgPSBfZm9ybWF0cGFyYW0ocCwgdiwgcmVxdW90ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuZXdfY3R5cGUgPSBTRU1JU1BBQ0Uuam9pbihbbmV3X2N0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zvcm1hdHBhcmFtKHAsIHYsIHJlcXVvdGUpXSkKKyAgICAgICAgaWYgbmV3X2N0eXBlIDw+IHNlbGYuZ2V0KGhlYWRlcik6CisgICAgICAgICAgICBkZWwgc2VsZltoZWFkZXJdCisgICAgICAgICAgICBzZWxmW2hlYWRlcl0gPSBuZXdfY3R5cGUKKworICAgIGRlZiBzZXRfdHlwZShzZWxmLCB0eXBlLCBoZWFkZXI9J0NvbnRlbnQtVHlwZScsIHJlcXVvdGU9MSk6CisgICAgICAgICIiIlNldCB0aGUgbWFpbiB0eXBlIGFuZCBzdWJ0eXBlIGZvciB0aGUgQ29udGVudC1UeXBlOiBoZWFkZXIuCisKKyAgICAgICAgdHlwZSBtdXN0IGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtICJtYWludHlwZS9zdWJ0eXBlIiwgb3RoZXJ3aXNlIGEKKyAgICAgICAgVmFsdWVFcnJvciBpcyByYWlzZWQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIENvbnRlbnQtVHlwZTogaGVhZGVyLCBrZWVwaW5nIGFsbCB0aGUKKyAgICAgICAgcGFyYW1ldGVycyBpbiBwbGFjZS4gIElmIHJlcXVvdGUgaXMgZmFsc2UsIHRoaXMgbGVhdmVzIHRoZSBleGlzdGluZworICAgICAgICBoZWFkZXIncyBxdW90aW5nIGFzIGlzLiAgT3RoZXJ3aXNlLCB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIHF1b3RlZCAodGhlCisgICAgICAgIGRlZmF1bHQpLgorCisgICAgICAgIEFuIGFsdGVybmF0ZSBoZWFkZXIgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyIGFyZ3VtZW50LiAgV2hlbiB0aGUKKyAgICAgICAgQ29udGVudC1UeXBlOiBoZWFkZXIgaXMgc2V0LCB3ZSdsbCBhbHdheXMgYWxzbyBhZGQgYSBNSU1FLVZlcnNpb246CisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgICMgQkFXOiBzaG91bGQgd2UgYmUgc3RyaWN0PworICAgICAgICBpZiBub3QgdHlwZS5jb3VudCgnLycpID09IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgICMgU2V0IHRoZSBDb250ZW50LVR5cGU6IHlvdSBnZXQgYSBNSU1FLVZlcnNpb246CisgICAgICAgIGlmIGhlYWRlci5sb3dlcigpID09ICdjb250ZW50LXR5cGUnOgorICAgICAgICAgICAgZGVsIHNlbGZbJ21pbWUtdmVyc2lvbiddCisgICAgICAgICAgICBzZWxmWydNSU1FLVZlcnNpb24nXSA9ICcxLjAnCisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19rZXkoaGVhZGVyKToKKyAgICAgICAgICAgIHNlbGZbaGVhZGVyXSA9IHR5cGUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwYXJhbXMgPSBzZWxmLmdldF9wYXJhbXMoaGVhZGVyLCB1bnF1b3RlPXJlcXVvdGUpCisgICAgICAgIGRlbCBzZWxmW2hlYWRlcl0KKyAgICAgICAgc2VsZltoZWFkZXJdID0gdHlwZQorICAgICAgICAjIFNraXAgdGhlIGZpcnN0IHBhcmFtOyBpdCdzIHRoZSBvbGQgdHlwZS4KKyAgICAgICAgZm9yIHAsIHYgaW4gcGFyYW1zWzE6XToKKyAgICAgICAgICAgIHNlbGYuc2V0X3BhcmFtKHAsIHYsIGhlYWRlciwgcmVxdW90ZSkKKwogICAgIGRlZiBnZXRfZmlsZW5hbWUoc2VsZiwgZmFpbG9iaj1Ob25lKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBmaWxlbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBheWxvYWQgaWYgcHJlc2VudC4KIApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL1BhcnNlci5weSBiL0xpYi9lbWFpbC9QYXJzZXIucHkKaW5kZXggMmYxMzFkNi4uNzE3N2RmYyAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL1BhcnNlci5weQorKysgYi9MaWIvZW1haWwvUGFyc2VyLnB5CkBAIC01MSw5ICs1MSwxNiBAQAogICAgICAgICBsYXN0dmFsdWUgPSBbXQogICAgICAgICBsaW5lbm8gPSAwCiAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKVs6LTFdCi0gICAgICAgICAgICBpZiBub3QgbGluZSBvciBub3QgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgIyBEb24ndCBzdHJpcCB0aGUgbGluZSBiZWZvcmUgd2UgdGVzdCBmb3IgdGhlIGVuZCBjb25kaXRpb24sCisgICAgICAgICAgICAjIGJlY2F1c2Ugd2hpdGVzcGFjZS1vbmx5IGhlYWRlciBsaW5lcyBhcmUgUkZDIGNvbXBsaWFudAorICAgICAgICAgICAgIyBjb250aW51YXRpb24gbGluZXMuCisgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0bGluZXMoKVswXQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgSWdub3JlIHRoZSB0cmFpbGluZyBuZXdsaW5lCiAgICAgICAgICAgICBsaW5lbm8gKz0gMQogICAgICAgICAgICAgIyBDaGVjayBmb3IgaW5pdGlhbCBVbml4IEZyb21fIGxpbmUKICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnRnJvbSAnKToKQEAgLTYzLDcgKzcwLDYgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcnMuSGVhZGVyUGFyc2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICdVbml4LWZyb20gaW4gaGVhZGVycyBhZnRlciBmaXJzdCByZmM4MjIgaGVhZGVyJykKLSAgICAgICAgICAgICMKICAgICAgICAgICAgICMgSGVhZGVyIGNvbnRpbnVhdGlvbiBsaW5lCiAgICAgICAgICAgICBpZiBsaW5lWzBdIGluICcgXHQnOgogICAgICAgICAgICAgICAgIGlmIG5vdCBsYXN0aGVhZGVyOgpAQCAtMTM0LDExICsxNDAsMTEgQEAKICAgICAgICAgICAgICAgICBtc2dvYmogPSBzZWxmLnBhcnNlc3RyKHBhcnQpCiAgICAgICAgICAgICAgICAgY29udGFpbmVyLnByZWFtYmxlID0gcHJlYW1ibGUKICAgICAgICAgICAgICAgICBjb250YWluZXIuZXBpbG9ndWUgPSBlcGlsb2d1ZQotICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIGNvbnRhaW5lcidzIHBheWxvYWQgaXMgYSBsaXN0Ci0gICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29udGFpbmVyLmdldF9wYXlsb2FkKCksIExpc3RUeXBlKToKLSAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnNldF9wYXlsb2FkKFttc2dvYmpdKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRfcGF5bG9hZChtc2dvYmopCisgICAgICAgICAgICAgICAgY29udGFpbmVyLmF0dGFjaChtc2dvYmopCisgICAgICAgIGVsaWYgY29udGFpbmVyLmdldF9tYWluX3R5cGUoKSA9PSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgICAgICMgVmVyeSBiYWQuICBBIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQgd2l0aCBubyBib3VuZGFyeSEKKyAgICAgICAgICAgIHJhaXNlIEVycm9ycy5Cb3VuZGFyeUVycm9yKAorICAgICAgICAgICAgICAgICdtdWx0aXBhcnQgbWVzc2FnZSB3aXRoIG5vIGRlZmluZWQgYm91bmRhcnknKQogICAgICAgICBlbGlmIGNvbnRhaW5lci5nZXRfdHlwZSgpID09ICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyc6CiAgICAgICAgICAgICAjIFRoaXMgc3BlY2lhbCBraW5kIG9mIHR5cGUgY29udGFpbnMgYmxvY2tzIG9mIGhlYWRlcnMgc2VwYXJhdGVkCiAgICAgICAgICAgICAjIGJ5IGEgYmxhbmsgbGluZS4gIFdlJ2xsIHJlcHJlc2VudCBlYWNoIGhlYWRlciBibG9jayBhcyBhCkBAIC0xNjAsOSArMTY2LDkgQEAKICAgICAgICAgICAgIGV4Y2VwdCBFcnJvcnMuSGVhZGVyUGFyc2VFcnJvcjoKICAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLl9jbGFzcygpCiAgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2Vib2R5KG1zZywgZnApCi0gICAgICAgICAgICBjb250YWluZXIuYWRkX3BheWxvYWQobXNnKQorICAgICAgICAgICAgY29udGFpbmVyLnNldF9wYXlsb2FkKG1zZykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGNvbnRhaW5lci5hZGRfcGF5bG9hZChmcC5yZWFkKCkpCisgICAgICAgICAgICBjb250YWluZXIuc2V0X3BheWxvYWQoZnAucmVhZCgpKQogCiAKIAwKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9VdGlscy5weSBiL0xpYi9lbWFpbC9VdGlscy5weQppbmRleCAzZDQ4Mjg3Li44ODdiZTU1IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvVXRpbHMucHkKKysrIGIvTGliL2VtYWlsL1V0aWxzLnB5CkBAIC0xLDE2ICsxLDI2IEBACi0jIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IGJhcnJ5QHpvcGUuY29tIChCYXJyeSBXYXJzYXcpCiAKICIiIk1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzLgogIiIiCiAKIGltcG9ydCB0aW1lCitpbXBvcnQgc29ja2V0CiBpbXBvcnQgcmUKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBvcworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdHlwZXMgaW1wb3J0IExpc3RUeXBlCiAKLWZyb20gcmZjODIyIGltcG9ydCB1bnF1b3RlLCBxdW90ZSwgcGFyc2VhZGRyCi1mcm9tIHJmYzgyMiBpbXBvcnQgZHVtcF9hZGRyZXNzX3BhaXIKK2Zyb20gcmZjODIyIGltcG9ydCB1bnF1b3RlLCBxdW90ZQogZnJvbSByZmM4MjIgaW1wb3J0IEFkZHJsaXN0Q2xhc3MgYXMgX0FkZHJsaXN0Q2xhc3MKLWZyb20gcmZjODIyIGltcG9ydCBwYXJzZWRhdGVfdHosIHBhcnNlZGF0ZSwgbWt0aW1lX3R6Citmcm9tIHJmYzgyMiBpbXBvcnQgbWt0aW1lX3R6CisKKyMgV2UgbmVlZCB3b3JtYXJvdW5kcyBmb3IgYnVncyBpbiB0aGVzZSBtZXRob2RzIGluIG9sZGVyIFB5dGhvbnMgKHNlZSBiZWxvdykKK2Zyb20gcmZjODIyIGltcG9ydCBwYXJzZWRhdGUgYXMgX3BhcnNlZGF0ZQorZnJvbSByZmM4MjIgaW1wb3J0IHBhcnNlZGF0ZV90eiBhcyBfcGFyc2VkYXRlX3R6Citmcm9tIHJmYzgyMiBpbXBvcnQgcGFyc2VhZGRyIGFzIF9wYXJzZWFkZHIKIAogZnJvbSBxdW9wcmkgaW1wb3J0IGRlY29kZXN0cmluZyBhcyBfcWRlY29kZQogaW1wb3J0IGJhc2U2NApAQCAtMjAsNiArMzAsMTAgQEAKIAogQ09NTUFTUEFDRSA9ICcsICcKIFVFTVBUWVNUUklORyA9IHUnJworQ1JMRiA9ICdcclxuJworCitzcGVjaWFsc3JlID0gcmUuY29tcGlsZShyJ1tdW1woKTw+QCw6OyIuXScpCitlc2NhcGVzcmUgPSByZS5jb21waWxlKHInW11bXCgpIl0nKQogCiAKIAwKQEAgLTQ0LDYgKzU4LDQxIEBACiAKIAogDAorZGVmIGZpeF9lb2xzKHMpOgorICAgICIiIlJlcGxhY2UgYWxsIGxpbmUtZW5kaW5nIGNoYXJhY3RlcnMgd2l0aCBcclxuLiIiIgorICAgICMgRml4IG5ld2xpbmVzIHdpdGggbm8gcHJlY2VkaW5nIGNhcnJpYWdlIHJldHVybgorICAgIHMgPSByZS5zdWIocicoPzwhXHIpXG4nLCBDUkxGLCBzKQorICAgICMgRml4IGNhcnJpYWdlIHJldHVybnMgd2l0aCBubyBmb2xsb3dpbmcgbmV3bGluZQorICAgIHMgPSByZS5zdWIocidccig/IVxuKScsIENSTEYsIHMpCisgICAgcmV0dXJuIHMKKworCisMCitkZWYgZm9ybWF0YWRkcihwYWlyKToKKyAgICAiIiJUaGUgaW52ZXJzZSBvZiBwYXJzZWFkZHIoKSwgdGhpcyB0YWtlcyBhIDItdHVwbGUgb2YgdGhlIGZvcm0KKyAgICAocmVhbG5hbWUsIGVtYWlsX2FkZHJlc3MpIGFuZCByZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgc3VpdGFibGUKKyAgICBmb3IgYW4gUkZDIDI4MjIgRnJvbTosIFRvOiBvciBDYzouCisgICAgCisgICAgSWYgdGhlIGZpcnN0IGVsZW1lbnQgb2YgcGFpciBpcyBmYWxzZSwgdGhlbiB0aGUgc2Vjb25kIGVsZW1lbnQgaXMKKyAgICByZXR1cm5lZCB1bm1vZGlmaWVkLgorICAgICIiIgorICAgIG5hbWUsIGFkZHJlc3MgPSBwYWlyCisgICAgaWYgbmFtZToKKyAgICAgICAgcXVvdGVzID0gJycKKyAgICAgICAgaWYgc3BlY2lhbHNyZS5zZWFyY2gobmFtZSk6CisgICAgICAgICAgICBxdW90ZXMgPSAnIicKKyAgICAgICAgbmFtZSA9IGVzY2FwZXNyZS5zdWIocidcXFxnPDA+JywgbmFtZSkKKyAgICAgICAgcmV0dXJuICclcyVzJXMgPCVzPicgJSAocXVvdGVzLCBuYW1lLCBxdW90ZXMsIGFkZHJlc3MpCisgICAgcmV0dXJuIGFkZHJlc3MKKworIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK2RlZiBkdW1wX2FkZHJlc3NfcGFpcihwYWlyKToKKyAgICB3YXJuaW5ncy53YXJuKCdVc2UgZW1haWwuVXRpbHMuZm9ybWF0YWRkcigpIGluc3RlYWQnLAorICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgIHJldHVybiBmb3JtYXRhZGRyKHBhaXIpCisKKworDAogZGVmIGdldGFkZHJlc3NlcyhmaWVsZHZhbHVlcyk6CiAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiAoUkVBTE5BTUUsIEVNQUlMKSBmb3IgZWFjaCBmaWVsZHZhbHVlLiIiIgogICAgIGFsbCA9IENPTU1BU1BBQ0Uuam9pbihmaWVsZHZhbHVlcykKQEAgLTY0LDMwICsxMTMsMjYgQEAKIAogCiBkZWYgZGVjb2RlKHMpOgotICAgICIiIlJldHVybiBhIGRlY29kZWQgc3RyaW5nIGFjY29yZGluZyB0byBSRkMgMjA0NywgYXMgYSB1bmljb2RlIHN0cmluZy4iIiIKKyAgICAiIiJSZXR1cm4gYSBkZWNvZGVkIHN0cmluZyBhY2NvcmRpbmcgdG8gUkZDIDIwNDcsIGFzIGEgdW5pY29kZSBzdHJpbmcuCisKKyAgICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuICBVc2UgSGVhZGVyLmRlY29kZV9oZWFkZXIoKSBpbnN0ZWFkLgorICAgICIiIgorICAgIHdhcm5pbmdzLndhcm4oJ1VzZSBIZWFkZXIuZGVjb2RlX2hlYWRlcigpIGluc3RlYWQuJywgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgICMgSW50cmEtcGFja2FnZSBpbXBvcnQgaGVyZSB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnQgcHJvYmxlbXMuCisgICAgZnJvbSBIZWFkZXIgaW1wb3J0IGRlY29kZV9oZWFkZXIKKyAgICBMID0gZGVjb2RlX2hlYWRlcihzKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKEwsIExpc3RUeXBlKToKKyAgICAgICAgIyBzIHdhc24ndCBkZWNvZGVkCisgICAgICAgIHJldHVybiBzCisKICAgICBydG4gPSBbXQotICAgIHBhcnRzID0gZWNyZS5zcGxpdChzLCAxKQotICAgIHdoaWxlIHBhcnRzOgotICAgICAgICAjIElmIHRoZXJlIGFyZSBsZXNzIHRoYW4gNCBwYXJ0cywgaXQgY2FuJ3QgYmUgZW5jb2RlZCBhbmQgd2UncmUgZG9uZQotICAgICAgICBpZiBsZW4ocGFydHMpIDwgNToKLSAgICAgICAgICAgIHJ0bi5leHRlbmQocGFydHMpCi0gICAgICAgICAgICBicmVhawotICAgICAgICAjIFRoZSBmaXJzdCBlbGVtZW50IGlzIGFueSBub24tZW5jb2RlZCBsZWFkaW5nIHRleHQKLSAgICAgICAgcnRuLmFwcGVuZChwYXJ0c1swXSkKLSAgICAgICAgY2hhcnNldCA9IHBhcnRzWzFdCi0gICAgICAgIGVuY29kaW5nID0gcGFydHNbMl0ubG93ZXIoKQotICAgICAgICBhdG9tID0gcGFydHNbM10KLSAgICAgICAgIyBUaGUgbmV4dCBjaHVuayB0byBkZWNvZGUgc2hvdWxkIGJlIGluIHBhcnRzWzRdCi0gICAgICAgIHBhcnRzID0gZWNyZS5zcGxpdChwYXJ0c1s0XSkKLSAgICAgICAgIyBUaGUgZW5jb2RpbmcgbXVzdCBiZSBlaXRoZXIgYHEnIG9yIGBiJywgY2FzZS1pbnNlbnNpdGl2ZQotICAgICAgICBpZiBlbmNvZGluZyA9PSAncSc6Ci0gICAgICAgICAgICBmdW5jID0gX3FkZWNvZGUKLSAgICAgICAgZWxpZiBlbmNvZGluZyA9PSAnYic6Ci0gICAgICAgICAgICBmdW5jID0gX2JkZWNvZGUKKyAgICBmb3IgYXRvbSwgY2hhcnNldCBpbiBMOgorICAgICAgICBpZiBjaGFyc2V0IGlzIE5vbmU6CisgICAgICAgICAgICBydG4uYXBwZW5kKGF0b20pCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmdW5jID0gX2lkZW50aXR5Ci0gICAgICAgICMgRGVjb2RlIGFuZCBnZXQgdGhlIHVuaWNvZGUgaW4gdGhlIGNoYXJzZXQKLSAgICAgICAgcnRuLmFwcGVuZCh1bmljb2RlKGZ1bmMoYXRvbSksIGNoYXJzZXQpKQorICAgICAgICAgICAgIyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gVW5pY29kZSB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuICBMZWF2ZQorICAgICAgICAgICAgIyBVbmljb2RlIGNvbnZlcnNpb24gZXJyb3JzIHRvIHN0cmljdC4KKyAgICAgICAgICAgIHJ0bi5hcHBlbmQodW5pY29kZShhdG9tLCBjaGFyc2V0KSkKICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGRlY29kZWQgZXZlcnl0aGluZywgd2UganVzdCBuZWVkIHRvIGpvaW4gYWxsIHRoZSBwYXJ0cwogICAgICMgdG9nZXRoZXIgaW50byB0aGUgZmluYWwgc3RyaW5nLgogICAgIHJldHVybiBVRU1QVFlTVFJJTkcuam9pbihydG4pCkBAIC05Niw2ICsxNDEsNyBAQAogDAogZGVmIGVuY29kZShzLCBjaGFyc2V0PSdpc28tODg1OS0xJywgZW5jb2Rpbmc9J3EnKToKICAgICAiIiJFbmNvZGUgYSBzdHJpbmcgYWNjb3JkaW5nIHRvIFJGQyAyMDQ3LiIiIgorICAgIHdhcm5pbmdzLndhcm4oJ1VzZSBIZWFkZXIuSGVhZGVyLmVuY29kZSgpIGluc3RlYWQuJywgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQogICAgIGVuY29kaW5nID0gZW5jb2RpbmcubG93ZXIoKQogICAgIGlmIGVuY29kaW5nID09ICdxJzoKICAgICAgICAgZXN0ciA9IF9xZW5jb2RlKHMpCkBAIC0xNTAsMyArMTk2LDQ4IEBACiAgICAgICAgICAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXVtub3dbMV0gLSAxXSwKICAgICAgICAgbm93WzBdLCBub3dbM10sIG5vd1s0XSwgbm93WzVdLAogICAgICAgICB6b25lKQorCisKKwwKK2RlZiBtYWtlX21zZ2lkKGlkc3RyaW5nPU5vbmUpOgorICAgICIiIlJldHVybnMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIFJGQyAyODIyIGNvbXBsaWFudCBNZXNzYWdlLUlEOiwgZS5nOgorCisgICAgPDIwMDIwMjAxMTk1NjI3LjMzNTM5Ljk2NjcxQG5pZ2h0c2hhZGUubGEubWFzdGFsZXIuY29tPgorCisgICAgT3B0aW9uYWwgaWRzdHJpbmcgaWYgZ2l2ZW4gaXMgYSBzdHJpbmcgdXNlZCB0byBzdHJlbmd0aGVuIHRoZQorICAgIHVuaXF1ZW5lc3Mgb2YgdGhlIE1lc3NhZ2UtSUQsIG90aGVyd2lzZSBhbiBlbXB0eSBzdHJpbmcgaXMgdXNlZC4KKyAgICAiIiIKKyAgICB0aW1ldmFsID0gdGltZS50aW1lKCkKKyAgICB1dGNkYXRlID0gdGltZS5zdHJmdGltZSgnJVklbSVkJUglTSVTJywgdGltZS5nbXRpbWUodGltZXZhbCkpCisgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICByYW5kaW50ID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDApCisgICAgaWYgaWRzdHJpbmcgaXMgTm9uZToKKyAgICAgICAgaWRzdHJpbmcgPSAnJworICAgIGVsc2U6CisgICAgICAgIGlkc3RyaW5nID0gJy4nICsgaWRzdHJpbmcKKyAgICBpZGhvc3QgPSBzb2NrZXQuZ2V0ZnFkbigpCisgICAgbXNnaWQgPSAnPCVzLiVzLiVzJXNAJXM+JyAlICh1dGNkYXRlLCBwaWQsIHJhbmRpbnQsIGlkc3RyaW5nLCBpZGhvc3QpCisgICAgcmV0dXJuIG1zZ2lkCisKKworDAorIyBUaGVzZSBmdW5jdGlvbnMgYXJlIGluIHRoZSBzdGFuZGFsb25lIG1pbWVsaWIgdmVyc2lvbiBvbmx5IGJlY2F1c2UgdGhleSd2ZQorIyBzdWJzZXF1ZW50bHkgYmVlbiBmaXhlZCBpbiB0aGUgbGF0ZXN0IFB5dGhvbiB2ZXJzaW9ucy4gIFdlIHVzZSB0aGlzIHRvIHdvcm0KKyMgYXJvdW5kIGJyb2tlbiBvbGRlciBQeXRob25zLgorZGVmIHBhcnNlZGF0ZShkYXRhKToKKyAgICBpZiBub3QgZGF0YToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gX3BhcnNlZGF0ZShkYXRhKQorCisKK2RlZiBwYXJzZWRhdGVfdHooZGF0YSk6CisgICAgaWYgbm90IGRhdGE6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIF9wYXJzZWRhdGVfdHooZGF0YSkKKworCitkZWYgcGFyc2VhZGRyKGFkZHIpOgorICAgIHJlYWxuYW1lLCBlbWFpbGFkZHIgPSBfcGFyc2VhZGRyKGFkZHIpCisgICAgaWYgcmVhbG5hbWUgPT0gJycgYW5kIGVtYWlsYWRkciBpcyBOb25lOgorICAgICAgICByZXR1cm4gJycsICcnCisgICAgcmV0dXJuIHJlYWxuYW1lLCBlbWFpbGFkZHIKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9fX2luaXRfXy5weSBiL0xpYi9lbWFpbC9fX2luaXRfXy5weQppbmRleCBjMTM0OTViLi5mNGE1Yjc2IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvX19pbml0X18ucHkKKysrIGIvTGliL2VtYWlsL19faW5pdF9fLnB5CkBAIC0xLDE0ICsxLDE2IEBACi0jIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IGJhcnJ5QHpvcGUuY29tIChCYXJyeSBXYXJzYXcpCiAKICIiIkEgcGFja2FnZSBmb3IgcGFyc2luZywgaGFuZGxpbmcsIGFuZCBnZW5lcmF0aW5nIGVtYWlsIG1lc3NhZ2VzLgogIiIiCiAKLV9fdmVyc2lvbl9fID0gJzEuMCcKK19fdmVyc2lvbl9fID0gJzIuMCcKIAotX19hbGxfXyA9IFsnRW5jb2RlcnMnLAorX19hbGxfXyA9IFsnQ2hhcnNldCcsCisgICAgICAgICAgICdFbmNvZGVycycsCiAgICAgICAgICAgICdFcnJvcnMnLAogICAgICAgICAgICAnR2VuZXJhdG9yJywKKyAgICAgICAgICAgJ0hlYWRlcicsCiAgICAgICAgICAgICdJdGVyYXRvcnMnLAogICAgICAgICAgICAnTUlNRUF1ZGlvJywKICAgICAgICAgICAgJ01JTUVCYXNlJywKQEAgLTE4LDYgKzIwLDggQEAKICAgICAgICAgICAgJ01lc3NhZ2UnLAogICAgICAgICAgICAnUGFyc2VyJywKICAgICAgICAgICAgJ1V0aWxzJywKKyAgICAgICAgICAgJ2Jhc2U2NE1JTUUnLAorICAgICAgICAgICAncXVvcHJpTUlNRScsCiAgICAgICAgICAgICdtZXNzYWdlX2Zyb21fc3RyaW5nJywKICAgICAgICAgICAgJ21lc3NhZ2VfZnJvbV9maWxlJywKICAgICAgICAgICAgXQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL2Jhc2U2NE1JTUUucHkgYi9MaWIvZW1haWwvYmFzZTY0TUlNRS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODQyMGIyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL2Jhc2U2NE1JTUUucHkKQEAgLTAsMCArMSwxNzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogY2hlQGRlYmlhbi5vcmcgKEJlbiBHZXJ0emZpZWxkKQorCisiIiJCYXNlNjQgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBwZXIgUkZDcyAyMDQ1LTIwNDcuCisKK1RoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgbWV0aG9kIGRlZmluZWQgaW4gUkZDIDIwNDUKK3RvIGVuY29kZSBhcmJpdHJhcnkgOC1iaXQgZGF0YSB1c2luZyB0aGUgdGhyZWUgOC1iaXQgYnl0ZXMgaW4gZm91ciA3LWJpdAorY2hhcmFjdGVycyBlbmNvZGluZyBrbm93biBhcyBCYXNlNjQuCisKK0l0IGlzIHVzZWQgaW4gdGhlIE1JTUUgc3RhbmRhcmRzIGZvciBlbWFpbCB0byBhdHRhY2ggaW1hZ2VzLCBhdWRpbywgYW5kIHRleHQKK3VzaW5nIHNvbWUgOC1iaXQgY2hhcmFjdGVyIHNldHMgdG8gbWVzc2FnZXMuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBlbmNvZGUgYW5kIGRlY29kZSBib3RoIGhlYWRlcnMgYW5kIGJvZGllcword2l0aCBCYXNlNjQgZW5jb2RpbmcuCisKK1JGQyAyMDQ1IGRlZmluZXMgYSBtZXRob2QgZm9yIGluY2x1ZGluZyBjaGFyYWN0ZXIgc2V0IGluZm9ybWF0aW9uIGluIGFuCitgZW5jb2RlZC13b3JkJyBpbiBhIGhlYWRlci4gIFRoaXMgbWV0aG9kIGlzIGNvbW1vbmx5IHVzZWQgZm9yIDgtYml0IHJlYWwgbmFtZXMKK2luIFRvOiwgRnJvbTosIENjOiwgZXRjLiBmaWVsZHMsIGFzIHdlbGwgYXMgU3ViamVjdDogbGluZXMuCisKK1RoaXMgbW9kdWxlIGRvZXMgbm90IGRvIHRoZSBsaW5lIHdyYXBwaW5nIG9yIGVuZC1vZi1saW5lIGNoYXJhY3RlciBjb252ZXJzaW9uCituZWNlc3NhcnkgZm9yIHByb3BlciBpbnRlcm5hdGlvbmFsaXplZCBoZWFkZXJzOyBpdCBvbmx5IGRvZXMgZHVtYiBlbmNvZGluZyBhbmQKK2RlY29kaW5nLiAgVG8gZGVhbCB3aXRoIHRoZSB2YXJpb3VzIGxpbmUgd3JhcHBpbmcgaXNzdWVzLCB1c2UgdGhlIGVtYWlsLkhlYWRlcgorbW9kdWxlLgorIiIiCisKK2ltcG9ydCByZQorZnJvbSBiaW5hc2NpaSBpbXBvcnQgYjJhX2Jhc2U2NCwgYTJiX2Jhc2U2NAorZnJvbSBlbWFpbC5VdGlscyBpbXBvcnQgZml4X2VvbHMKKworQ1JMRiA9ICdcclxuJworTkwgPSAnXG4nCitFTVBUWVNUUklORyA9ICcnCisKKyMgU2VlIGFsc28gQ2hhcnNldC5weQorTUlTQ19MRU4gPSA3CisKKworDAorIyBIZWxwZXJzCitkZWYgYmFzZTY0X2xlbihzKToKKyAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiBzIHdoZW4gaXQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC4iIiIKKyAgICBncm91cHNfb2ZfMywgbGVmdG92ZXIgPSBkaXZtb2QobGVuKHMpLCAzKSAKKyAgICAjIDQgYnl0ZXMgb3V0IGZvciBlYWNoIDMgYnl0ZXMgKG9yIG5vbnplcm8gZnJhY3Rpb24gdGhlcmVvZikgaW4uIAorICAgICMgVGhhbmtzLCBUaW0hCisgICAgbiA9IGdyb3Vwc19vZl8zICogNCAKKyAgICBpZiBsZWZ0b3ZlcjogCisgICAgICAgIG4gKz0gNCAKKyAgICByZXR1cm4gbiAKKworCisMCitkZWYgaGVhZGVyX2VuY29kZShoZWFkZXIsIGNoYXJzZXQ9J2lzby04ODU5LTEnLCBrZWVwX2VvbHM9MCwgbWF4bGluZWxlbj03NiwKKyAgICAgICAgICAgICAgICAgIGVvbD1OTCk6CisgICAgIiIiRW5jb2RlIGEgc2luZ2xlIGhlYWRlciBsaW5lIHdpdGggQmFzZTY0IGVuY29kaW5nIGluIGEgZ2l2ZW4gY2hhcnNldC4KKyAgICAKKyAgICBEZWZpbmVkIGluIFJGQyAyMDQ1LCB0aGlzIEJhc2U2NCBlbmNvZGluZyBpcyBpZGVudGljYWwgdG8gbm9ybWFsIEJhc2U2NAorICAgIGVuY29kaW5nLCBleGNlcHQgdGhhdCBlYWNoIGxpbmUgbXVzdCBiZSBpbnRlbGxpZ2VudGx5IHdyYXBwZWQgKHJlc3BlY3RpbmcKKyAgICB0aGUgQmFzZTY0IGVuY29kaW5nKSwgYW5kIHN1YnNlcXVlbnQgbGluZXMgbXVzdCBzdGFydCB3aXRoIGEgc3BhY2UuCisKKyAgICBjaGFyc2V0IG5hbWVzIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSB0byBlbmNvZGUgdGhlIGhlYWRlci4gIEl0IGRlZmF1bHRzCisgICAgdG8gaXNvLTg4NTktMS4KKworICAgIEVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKFxcciwgXFxuLCBcXHJcXG4pIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQKKyAgICB0byB0aGUgY2Fub25pY2FsIGVtYWlsIGxpbmUgc2VwYXJhdG9yIFxcclxcbiB1bmxlc3MgdGhlIGtlZXBfZW9scworICAgIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSAodGhlIGRlZmF1bHQgaXMgZmFsc2UpLgorCisgICAgRWFjaCBsaW5lIG9mIHRoZSBoZWFkZXIgd2lsbCBiZSB0ZXJtaW5hdGVkIGluIHRoZSB2YWx1ZSBvZiBlb2wsIHdoaWNoCisgICAgZGVmYXVsdHMgdG8gIlxcbiIuICBTZXQgdGhpcyB0byAiXFxyXFxuIiBpZiB5b3UgYXJlIHVzaW5nIHRoZSByZXN1bHQgb2YKKyAgICB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGluIGVtYWlsLgorCisgICAgVGhlIHJlc3VsdGluZyBzdHJpbmcgd2lsbCBiZSBpbiB0aGUgZm9ybToKKworICAgICI9P2NoYXJzZXQ/Yj9XVy81Y2lCdFlYcDY2WExySUhmOGVpQmhJR2hoYlhCemRHSHVjaUJCSUZsditYSWdiV0Y2ZXVseT89XFxuCisgICAgICA9P2NoYXJzZXQ/Yj82eUIzL0hvZ1lTQm9ZVzF3YzNSaDduSWdRa01nV1cvNWNpQnRZWHA2NlhMcklIZjhlaUJoSUdoaD89IgorICAgICAgCisgICAgd2l0aCBlYWNoIGxpbmUgd3JhcHBlZCBhdCwgYXQgbW9zdCwgbWF4bGluZWxlbiBjaGFyYWN0ZXJzIChkZWZhdWx0cyB0byA3NgorICAgIGNoYXJhY3RlcnMpLgorICAgICIiIgorICAgICMgUmV0dXJuIGVtcHR5IGhlYWRlcnMgdW5jaGFuZ2VkCisgICAgaWYgbm90IGhlYWRlcjoKKyAgICAgICAgcmV0dXJuIGhlYWRlcgorCisgICAgaWYgbm90IGtlZXBfZW9sczoKKyAgICAgICAgaGVhZGVyID0gZml4X2VvbHMoaGVhZGVyKQorICAgIAorICAgICMgQmFzZTY0IGVuY29kZSBlYWNoIGxpbmUsIGluIGVuY29kZWQgY2h1bmtzIG5vIGdyZWF0ZXIgdGhhbiBtYXhsaW5lbGVuIGluCisgICAgIyBsZW5ndGgsIGFmdGVyIHRoZSBSRkMgY2hyb21lIGlzIGFkZGVkIGluLgorICAgIGJhc2U2NGVkID0gW10KKyAgICBtYXhfZW5jb2RlZCA9IG1heGxpbmVsZW4gLSBsZW4oY2hhcnNldCkgLSBNSVNDX0xFTgorICAgIG1heF91bmVuY29kZWQgPSBtYXhfZW5jb2RlZCAqIDMgLyA0CisKKyAgICAjIEJBVzogQmVuJ3Mgb3JpZ2luYWwgY29kZSB1c2VkIGEgc3RlcCBvZiBtYXhfdW5lbmNvZGVkLCBidXQgSSB0aGluayBpdAorICAgICMgb3VnaHQgdG8gYmUgbWF4X2VuY29kZWQuICBPdGhlcndpc2UsIHdoZXJlJ3MgbWF4X2VuY29kZWQgdXNlZD8gIEknbQorICAgICMgc3RpbGwgbm90IHN1cmUgd2hhdCB0aGUgCisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGhlYWRlciksIG1heF91bmVuY29kZWQpOgorICAgICAgICBiYXNlNjRlZC5hcHBlbmQoYjJhX2Jhc2U2NChoZWFkZXJbaTppK21heF91bmVuY29kZWRdKSkKKworICAgICMgTm93IGFkZCB0aGUgUkZDIGNocm9tZSB0byBlYWNoIGVuY29kZWQgY2h1bmsKKyAgICBsaW5lcyA9IFtdCisgICAgZm9yIGxpbmUgaW4gYmFzZTY0ZWQ6CisgICAgICAgICMgSWdub3JlIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBlYWNoIGxpbmUgaWYgaXQgaXMgYSBuZXdsaW5lCisgICAgICAgIGlmIGxpbmVbLTFdID09IE5MOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAjIEFkZCB0aGUgY2hyb21lCisgICAgICAgIGxpbmVzLmFwcGVuZCgnPT8lcz9iPyVzPz0nICUgKGNoYXJzZXQsIGxpbmUpKQorICAgICMgR2x1ZSB0aGUgbGluZXMgdG9nZXRoZXIgYW5kIHJldHVybiBpdC4gIEJBVzogc2hvdWxkIHdlIGJlIGFibGUgdG8KKyAgICAjIHNwZWNpZnkgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBpbiB0aGUgam9pbmVyPworICAgIGpvaW5lciA9IGVvbCArICcgJworICAgIHJldHVybiBqb2luZXIuam9pbihsaW5lcykKKworCisMCitkZWYgZW5jb2RlKHMsIGJpbmFyeT0xLCBtYXhsaW5lbGVuPTc2LCBlb2w9TkwpOgorICAgICIiIkVuY29kZSBhIHN0cmluZyB3aXRoIGJhc2U2NC4KKworICAgIEVhY2ggbGluZSB3aWxsIGJlIHdyYXBwZWQgYXQsIGF0IG1vc3QsIG1heGxpbmVsZW4gY2hhcmFjdGVycyAoZGVmYXVsdHMgdG8KKyAgICA3NiBjaGFyYWN0ZXJzKS4KKworICAgIElmIGJpbmFyeSBpcyBmYWxzZSwgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUKKyAgICBjYW5vbmljYWwgZW1haWwgZW5kLW9mLWxpbmUgc2VxdWVuY2UgXFxyXFxuLiAgT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBsZWZ0CisgICAgdmVyYmF0aW0gKHRoaXMgaXMgdGhlIGRlZmF1bHQpLgorCisgICAgRWFjaCBsaW5lIG9mIGVuY29kZWQgdGV4dCB3aWxsIGVuZCB3aXRoIGVvbCwgd2hpY2ggZGVmYXVsdHMgdG8gIlxcbiIuICBTZXQKKyAgICB0aGlzIHRvICJcclxuIiBpZiB5b3Ugd2lsbCBiZSB1c2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKKyAgICBpbiBhbiBlbWFpbC4KKyAgICAiIiIKKyAgICBpZiBub3QgczoKKyAgICAgICAgcmV0dXJuIHMKKyAgICAKKyAgICBpZiBub3QgYmluYXJ5OgorICAgICAgICBzID0gZml4X2VvbHMocykKKyAgICAgICAgCisgICAgZW5jdmVjID0gW10KKyAgICBtYXhfdW5lbmNvZGVkID0gbWF4bGluZWxlbiAqIDMgLyA0CisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHMpLCBtYXhfdW5lbmNvZGVkKToKKyAgICAgICAgIyBCQVc6IHNob3VsZCBlbmNvZGUoKSBpbmhlcml0IGIyYV9iYXNlNjQoKSdzIGR1YmlvdXMgYmVoYXZpb3IgaW4KKyAgICAgICAgIyBhZGRpbmcgYSBuZXdsaW5lIHRvIHRoZSBlbmNvZGVkIHN0cmluZz8KKyAgICAgICAgZW5jID0gYjJhX2Jhc2U2NChzW2k6aSArIG1heF91bmVuY29kZWRdKQorICAgICAgICBpZiBlbmNbLTFdID09IE5MIGFuZCBlb2wgPD4gTkw6CisgICAgICAgICAgICBlbmMgPSBlbmNbOi0xXSArIGVvbAorICAgICAgICBlbmN2ZWMuYXBwZW5kKGVuYykKKyAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihlbmN2ZWMpCisKKworIyBGb3IgY29udmVuaWVuY2UgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHcvIHN0YW5kYXJkIGJhc2U2NCBtb2R1bGUKK2JvZHlfZW5jb2RlID0gZW5jb2RlCitlbmNvZGVzdHJpbmcgPSBlbmNvZGUKKworCisMCitkZWYgZGVjb2RlKHMsIGNvbnZlcnRfZW9scz1Ob25lKToKKyAgICAiIiJEZWNvZGUgYSByYXcgYmFzZTY0IHN0cmluZy4KKworICAgIElmIGNvbnZlcnRfZW9scyBpcyBzZXQgdG8gYSBzdHJpbmcgdmFsdWUsIGFsbCBjYW5vbmljYWwgZW1haWwgbGluZWZlZWRzLAorICAgIGUuZy4gIlxcclxcbiIsIGluIHRoZSBkZWNvZGVkIHRleHQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHZhbHVlIG9mCisgICAgY29udmVydF9lb2xzLiAgb3MubGluZXNlcCBpcyBhIGdvb2QgY2hvaWNlIGZvciBjb252ZXJ0X2VvbHMgaWYgeW91IGFyZQorICAgIGRlY29kaW5nIGEgdGV4dCBhdHRhY2htZW50LgorCisgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwYXJzZSBhIGZ1bGwgTUlNRSBoZWFkZXIgdmFsdWUgZW5jb2RlZCB3aXRoCisgICAgYmFzZTY0IChsaWtlID0/aXNvLTg4OTUtMT9iP2JtbG9JU0J1YVdnaD89KSAtLSBwbGVhc2UgdXNlIHRoZSBoaWdoCisgICAgbGV2ZWwgZW1haWwuSGVhZGVyIGNsYXNzIGZvciB0aGF0IGZ1bmN0aW9uYWxpdHkuCisgICAgIiIiCisgICAgaWYgbm90IHM6CisgICAgICAgIHJldHVybiBzCisgICAgCisgICAgZGVjID0gYTJiX2Jhc2U2NChzKQorICAgIGlmIGNvbnZlcnRfZW9sczoKKyAgICAgICAgcmV0dXJuIGRlYy5yZXBsYWNlKENSTEYsIGNvbnZlcnRfZW9scykKKyAgICByZXR1cm4gZGVjCisKKworIyBGb3IgY29udmVuaWVuY2UgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHcvIHN0YW5kYXJkIGJhc2U2NCBtb2R1bGUKK2JvZHlfZGVjb2RlID0gZGVjb2RlCitkZWNvZGVzdHJpbmcgPSBkZWNvZGUKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9xdW9wcmlNSU1FLnB5IGIvTGliL2VtYWlsL3F1b3ByaU1JTUUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyMDM0ZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9xdW9wcmlNSU1FLnB5CkBAIC0wLDAgKzEsMzEyIEBACisjIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogY2hlQGRlYmlhbi5vcmcgKEJlbiBHZXJ0emZpZWxkKQorCisiIiJRdW90ZWQtcHJpbnRhYmxlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgcGVyIFJGQ3MgMjA0NS0yMDQ3LgorCitUaGlzIG1vZHVsZSBoYW5kbGVzIHRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIG1ldGhvZCBkZWZpbmVkIGluIFJGQyAyMDQ1Cit0byBlbmNvZGUgVVMgQVNDSUktbGlrZSA4LWJpdCBkYXRhIGNhbGxlZCBgcXVvdGVkLXByaW50YWJsZScuICBJdCBpcyB1c2VkIHRvCitzYWZlbHkgZW5jb2RlIHRleHQgdGhhdCBpcyBpbiBhIGNoYXJhY3RlciBzZXQgc2ltaWxhciB0byB0aGUgNy1iaXQgVVMgQVNDSUkKK2NoYXJhY3RlciBzZXQsIGJ1dCB0aGF0IGluY2x1ZGVzIHNvbWUgOC1iaXQgY2hhcmFjdGVycyB0aGF0IGFyZSBub3JtYWxseSBub3QKK2FsbG93ZWQgaW4gZW1haWwgYm9kaWVzIG9yIGhlYWRlcnMuCisKK1F1b3RlZC1wcmludGFibGUgaXMgdmVyeSBzcGFjZS1pbmVmZmljaWVudCBmb3IgZW5jb2RpbmcgYmluYXJ5IGZpbGVzOyB1c2UgdGhlCitlbWFpbC5iYXNlNjRNSU1FIG1vZHVsZSBmb3IgdGhhdCBpbnN0ZWFkLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gZW5jb2RlIGFuZCBkZWNvZGUgYm90aCBoZWFkZXJzIGFuZCBib2RpZXMKK3dpdGggcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZy4KKworUkZDIDIwNDUgZGVmaW5lcyBhIG1ldGhvZCBmb3IgaW5jbHVkaW5nIGNoYXJhY3RlciBzZXQgaW5mb3JtYXRpb24gaW4gYW4KK2BlbmNvZGVkLXdvcmQnIGluIGEgaGVhZGVyLiAgVGhpcyBtZXRob2QgaXMgY29tbW9ubHkgdXNlZCBmb3IgOC1iaXQgcmVhbCBuYW1lcworaW4gVG86L0Zyb206L0NjOiBldGMuIGZpZWxkcywgYXMgd2VsbCBhcyBTdWJqZWN0OiBsaW5lcy4KKworVGhpcyBtb2R1bGUgZG9lcyBub3QgZG8gdGhlIGxpbmUgd3JhcHBpbmcgb3IgZW5kLW9mLWxpbmUgY2hhcmFjdGVyCitjb252ZXJzaW9uIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGludGVybmF0aW9uYWxpemVkIGhlYWRlcnM7IGl0IG9ubHkKK2RvZXMgZHVtYiBlbmNvZGluZyBhbmQgZGVjb2RpbmcuICBUbyBkZWFsIHdpdGggdGhlIHZhcmlvdXMgbGluZQord3JhcHBpbmcgaXNzdWVzLCB1c2UgdGhlIGVtYWlsLkhlYWRlciBtb2R1bGUuICAKKyIiIgorCitpbXBvcnQgcmUKK2Zyb20gc3RyaW5nIGltcG9ydCBoZXhkaWdpdHMKK2Zyb20gZW1haWwuVXRpbHMgaW1wb3J0IGZpeF9lb2xzCisKK0NSTEYgPSAnXHJcbicKK05MID0gJ1xuJworCisjIFNlZSBhbHNvIENoYXJzZXQucHkKK01JU0NfTEVOID0gNworCitocXJlID0gcmUuY29tcGlsZShyJ1teLWEtekEtWjAtOSEqKy8gXScpCiticXJlID0gcmUuY29tcGlsZShyJ1teICEtPD4tflx0XScpCisKKworDAorIyBIZWxwZXJzCitkZWYgaGVhZGVyX3F1b3ByaV9jaGVjayhjKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSBlc2NhcGVkIHdpdGggaGVhZGVyIHF1b3ByaS4iIiIKKyAgICByZXR1cm4gaHFyZS5tYXRjaChjKSBhbmQgMQorCisKK2RlZiBib2R5X3F1b3ByaV9jaGVjayhjKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSBlc2NhcGVkIHdpdGggYm9keSBxdW9wcmkuIiIiCisgICAgcmV0dXJuIGJxcmUubWF0Y2goYykgYW5kIDEKKworICAgIAorZGVmIGhlYWRlcl9xdW9wcmlfbGVuKHMpOgorICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIG9mIHN0ciB3aGVuIGl0IGlzIGVuY29kZWQgd2l0aCBoZWFkZXIgcXVvcHJpLiIiIgorICAgIGNvdW50ID0gMAorICAgIGZvciBjIGluIHM6CisgICAgICAgIGlmIGhxcmUubWF0Y2goYyk6CisgICAgICAgICAgICBjb3VudCArPSAzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgcmV0dXJuIGNvdW50CisKKworZGVmIGJvZHlfcXVvcHJpX2xlbihzdHIpOgorICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIG9mIHN0ciB3aGVuIGl0IGlzIGVuY29kZWQgd2l0aCBib2R5IHF1b3ByaS4iIiIKKyAgICBjb3VudCA9IDAKKyAgICBmb3IgYyBpbiBzdHI6CisgICAgICAgIGlmIGJxcmUubWF0Y2goYyk6CisgICAgICAgICAgICBjb3VudCArPSAzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgcmV0dXJuIGNvdW50CisKKworZGVmIF9tYXhfYXBwZW5kKEwsIHMsIG1heGxlbiwgZXh0cmE9JycpOgorICAgIGlmIG5vdCBMOgorICAgICAgICBMLmFwcGVuZChzKQorICAgIGVsaWYgbGVuKExbLTFdKSArIGxlbihzKSA8IG1heGxlbjoKKyAgICAgICAgTFstMV0gKz0gZXh0cmEgKyBzCisgICAgZWxzZToKKyAgICAgICAgTC5hcHBlbmQocykKKworCitkZWYgdW5xdW90ZShzKToKKyAgICAiIiJUdXJuIGEgc3RyaW5nIGluIHRoZSBmb3JtID1BQiB0byB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggdmFsdWUgMHhhYiIiIgorICAgIHJldHVybiBjaHIoaW50KHNbMTozXSwgMTYpKQorCisKK2RlZiBxdW90ZShjKToKKyAgICByZXR1cm4gIj0lMDJYIiAlIG9yZChjKQorCisKKwwKK2RlZiBoZWFkZXJfZW5jb2RlKGhlYWRlciwgY2hhcnNldD0iaXNvLTg4NTktMSIsIGtlZXBfZW9scz0wLCBtYXhsaW5lbGVuPTc2LAorICAgICAgICAgICAgICAgICAgZW9sPU5MKToKKyAgICAiIiJFbmNvZGUgYSBzaW5nbGUgaGVhZGVyIGxpbmUgd2l0aCBxdW90ZWQtcHJpbnRhYmxlIChsaWtlKSBlbmNvZGluZy4KKworICAgIERlZmluZWQgaW4gUkZDIDIwNDUsIHRoaXMgYFEnIGVuY29kaW5nIGlzIHNpbWlsYXIgdG8gcXVvdGVkLXByaW50YWJsZSwgYnV0CisgICAgdXNlZCBzcGVjaWZpY2FsbHkgZm9yIGVtYWlsIGhlYWRlciBmaWVsZHMgdG8gYWxsb3cgY2hhcnNldHMgd2l0aCBtb3N0bHkgNworICAgIGJpdCBjaGFyYWN0ZXJzIChhbmQgc29tZSA4IGJpdCkgdG8gcmVtYWluIG1vcmUgb3IgbGVzcyByZWFkYWJsZSBpbiBub24tUkZDCisgICAgMjA0NSBhd2FyZSBtYWlsIGNsaWVudHMuCisKKyAgICBjaGFyc2V0IG5hbWVzIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSB0byBlbmNvZGUgdGhlIGhlYWRlci4gIEl0IGRlZmF1bHRzCisgICAgdG8gaXNvLTg4NTktMS4KKworICAgIFRoZSByZXN1bHRpbmcgc3RyaW5nIHdpbGwgYmUgaW4gdGhlIGZvcm06CisKKyAgICAiPT9jaGFyc2V0P3E/SV9mPUUycnRfaW5feW91cl9nPUU4bj1FOHJhbF9kaXJlPUU3dGlvbj9cXG4KKyAgICAgID0/Y2hhcnNldD9xP1NpbGx5Xz1DOG5nbGlzaF9Lbj1FRWdodHM/PSIKKworICAgIHdpdGggZWFjaCBsaW5lIHdyYXBwZWQgc2FmZWx5IGF0LCBhdCBtb3N0LCBtYXhsaW5lbGVuIGNoYXJhY3RlcnMgKGRlZmF1bHRzCisgICAgdG8gNzYgY2hhcmFjdGVycykuCisKKyAgICBFbmQtb2YtbGluZSBjaGFyYWN0ZXJzIChcXHIsIFxcbiwgXFxyXFxuKSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkCisgICAgdG8gdGhlIGNhbm9uaWNhbCBlbWFpbCBsaW5lIHNlcGFyYXRvciBcXHJcXG4gdW5sZXNzIHRoZSBrZWVwX2VvbHMKKyAgICBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0IGlzIGZhbHNlKS4KKworICAgIEVhY2ggbGluZSBvZiB0aGUgaGVhZGVyIHdpbGwgYmUgdGVybWluYXRlZCBpbiB0aGUgdmFsdWUgb2YgZW9sLCB3aGljaAorICAgIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0IHRoaXMgdG8gIlxcclxcbiIgaWYgeW91IGFyZSB1c2luZyB0aGUgcmVzdWx0IG9mCisgICAgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSBpbiBlbWFpbC4KKyAgICAiIiIKKyAgICAjIFJldHVybiBlbXB0eSBoZWFkZXJzIHVuY2hhbmdlZAorICAgIGlmIG5vdCBoZWFkZXI6CisgICAgICAgIHJldHVybiBoZWFkZXIKKworICAgIGlmIG5vdCBrZWVwX2VvbHM6CisgICAgICAgIGhlYWRlciA9IGZpeF9lb2xzKGhlYWRlcikKKworICAgICMgUXVvcHJpIGVuY29kZSBlYWNoIGxpbmUsIGluIGVuY29kZWQgY2h1bmtzIG5vIGdyZWF0ZXIgdGhhbiBtYXhsaW5lbGVuIGluCisgICAgIyBsZW5naHQsIGFmdGVyIHRoZSBSRkMgY2hyb21lIGlzIGFkZGVkIGluLgorICAgIHF1b3RlZCA9IFtdCisgICAgbWF4X2VuY29kZWQgPSBtYXhsaW5lbGVuIC0gbGVuKGNoYXJzZXQpIC0gTUlTQ19MRU4KKyAgICAKKyAgICBmb3IgYyBpbiBoZWFkZXI6CisgICAgICAgICMgU3BhY2UgbWF5IGJlIHJlcHJlc2VudGVkIGFzIF8gaW5zdGVhZCBvZiA9MjAgZm9yIHJlYWRhYmlsaXR5CisgICAgICAgIGlmIGMgPT0gJyAnOgorICAgICAgICAgICAgX21heF9hcHBlbmQocXVvdGVkLCAnXycsIG1heF9lbmNvZGVkKQorICAgICAgICAjIFRoZXNlIGNoYXJhY3RlcnMgY2FuIGJlIGluY2x1ZGVkIHZlcmJhdGltCisgICAgICAgIGVsaWYgbm90IGhxcmUubWF0Y2goYyk6CisgICAgICAgICAgICBfbWF4X2FwcGVuZChxdW90ZWQsIGMsIG1heF9lbmNvZGVkKQorICAgICAgICAjIE90aGVyd2lzZSwgcmVwbGFjZSB3aXRoIGhleCB2YWx1ZSBsaWtlID1FMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgX21heF9hcHBlbmQocXVvdGVkLCAiPSUwMlgiICUgb3JkKGMpLCBtYXhfZW5jb2RlZCkKKworICAgICMgTm93IGFkZCB0aGUgUkZDIGNocm9tZSB0byBlYWNoIGVuY29kZWQgY2h1bmsgYW5kIGdsdWUgdGhlIGNodW5rcworICAgICMgdG9nZXRoZXIuICBCQVc6IHNob3VsZCB3ZSBiZSBhYmxlIHRvIHNwZWNpZnkgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBpbgorICAgICMgdGhlIGpvaW5lcj8KKyAgICBqb2luZXIgPSBlb2wgKyAnICcKKyAgICByZXR1cm4gam9pbmVyLmpvaW4oWyc9PyVzP3E/JXM/PScgJSAoY2hhcnNldCwgbGluZSkgZm9yIGxpbmUgaW4gcXVvdGVkXSkKKworCisMCitkZWYgZW5jb2RlKGJvZHksIGJpbmFyeT0wLCBtYXhsaW5lbGVuPTc2LCBlb2w9TkwpOgorICAgICIiIkVuY29kZSB3aXRoIHF1b3RlZC1wcmludGFibGUsIHdyYXBwaW5nIGF0IG1heGxpbmVsZW4gY2hhcmFjdGVycy4KKworICAgIElmIGJpbmFyeSBpcyBmYWxzZSAodGhlIGRlZmF1bHQpLCBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzIHdpbGwgYmUgY29udmVydGVkCisgICAgdG8gdGhlIGNhbm9uaWNhbCBlbWFpbCBlbmQtb2YtbGluZSBzZXF1ZW5jZSBcXHJcXG4uICBPdGhlcndpc2UgdGhleSB3aWxsCisgICAgYmUgbGVmdCB2ZXJiYXRpbS4KKworICAgIEVhY2ggbGluZSBvZiBlbmNvZGVkIHRleHQgd2lsbCBlbmQgd2l0aCBlb2wsIHdoaWNoIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0CisgICAgdGhpcyB0byAiXFxyXFxuIiBpZiB5b3Ugd2lsbCBiZSB1c2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKKyAgICBpbiBhbiBlbWFpbC4KKworICAgIEVhY2ggbGluZSB3aWxsIGJlIHdyYXBwZWQgYXQsIGF0IG1vc3QsIG1heGxpbmVsZW4gY2hhcmFjdGVycyAoZGVmYXVsdHMgdG8KKyAgICA3NiBjaGFyYWN0ZXJzKS4gIExvbmcgbGluZXMgd2lsbCBoYXZlIHRoZSBgc29mdCBsaW5lZmVlZCcgcXVvdGVkLXByaW50YWJsZQorICAgIGNoYXJhY3RlciAiPSIgYXBwZW5kZWQgdG8gdGhlbSwgc28gdGhlIGRlY29kZWQgdGV4dCB3aWxsIGJlIGlkZW50aWNhbCB0bworICAgIHRoZSBvcmlnaW5hbCB0ZXh0LgorICAgICIiIgorICAgIGlmIG5vdCBib2R5OgorICAgICAgICByZXR1cm4gYm9keQorCisgICAgaWYgbm90IGJpbmFyeToKKyAgICAgICAgYm9keSA9IGZpeF9lb2xzKGJvZHkpCisKKyAgICAjIEJBVzogV2UncmUgYWNjdW11bGF0aW5nIHRoZSBib2R5IHRleHQgYnkgc3RyaW5nIGNvbmNhdGVuYXRpb24uICBUaGF0CisgICAgIyBjYW4ndCBiZSB2ZXJ5IGVmZmljaWVudCwgYnV0IEkgZG9uJ3QgaGF2ZSB0aW1lIG5vdyB0byByZXdyaXRlIGl0LiAgSXQKKyAgICAjIGp1c3QgZmVlbHMgbGlrZSB0aGlzIGFsZ29yaXRobSBjb3VsZCBiZSBtb3JlIGVmZmljaWVudC4KKyAgICBlbmNvZGVkX2JvZHkgPSAnJworICAgIGxpbmVubyA9IC0xCisgICAgIyBQcmVzZXJ2ZSBsaW5lIGVuZGluZ3MgaGVyZSBzbyB3ZSBjYW4gY2hlY2sgbGF0ZXIgdG8gc2VlIGFuIGVvbCBuZWVkcyB0bworICAgICMgYmUgYWRkZWQgdG8gdGhlIG91dHB1dCBsYXRlci4KKyAgICBsaW5lcyA9IGJvZHkuc3BsaXRsaW5lcygxKQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAjIEJ1dCBzdHJpcCBvZmYgbGluZS1lbmRpbmdzIGZvciBwcm9jZXNzaW5nIHRoaXMgbGluZS4KKyAgICAgICAgaWYgbGluZS5lbmRzd2l0aChDUkxGKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0KKyAgICAgICAgZWxpZiBsaW5lWy0xXSBpbiBDUkxGOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgCisgICAgICAgIGxpbmVubyArPSAxCisgICAgICAgIGVuY29kZWRfbGluZSA9ICcnCisgICAgICAgIHByZXYgPSBOb25lCisgICAgICAgIGxpbmVsZW4gPSBsZW4obGluZSkKKyAgICAgICAgIyBOb3cgd2UgbmVlZCB0byBleGFtaW5lIGV2ZXJ5IGNoYXJhY3RlciB0byBzZWUgaWYgaXQgbmVlZHMgdG8gYmUKKyAgICAgICAgIyBxdW9wcmkgZW5jb2RlZC4gIEJBVzogYWdhaW4sIHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIGluZWZmaWNpZW50LgorICAgICAgICBmb3IgaiBpbiByYW5nZShsaW5lbGVuKToKKyAgICAgICAgICAgIGMgPSBsaW5lW2pdCisgICAgICAgICAgICBwcmV2ID0gYworICAgICAgICAgICAgaWYgYnFyZS5tYXRjaChjKToKKyAgICAgICAgICAgICAgICBjID0gcXVvdGUoYykKKyAgICAgICAgICAgIGVsaWYgaisxID09IGxpbmVsZW46CisgICAgICAgICAgICAgICAgIyBDaGVjayBmb3Igd2hpdGVzcGFjZSBhdCBlbmQgb2YgbGluZTsgc3BlY2lhbCBjYXNlCisgICAgICAgICAgICAgICAgaWYgYyBub3QgaW4gJyBcdCc6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfbGluZSArPSBjCisgICAgICAgICAgICAgICAgcHJldiA9IGMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgdG8gc2VlIGlmIHRoZSBsaW5lIGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIGxlbmd0aAorICAgICAgICAgICAgaWYgbGVuKGVuY29kZWRfbGluZSkgKyBsZW4oYykgPj0gbWF4bGluZWxlbjoKKyAgICAgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgJz0nICsgZW9sCisgICAgICAgICAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICAgICAgICAgIGVuY29kZWRfbGluZSArPSBjCisgICAgICAgICMgTm93IGF0IGVuZCBvZiBsaW5lLi4KKyAgICAgICAgaWYgcHJldiBhbmQgcHJldiBpbiAnIFx0JzoKKyAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiBmaWxlCisgICAgICAgICAgICBpZiBsaW5lbm8rMSA9PSBsZW4obGluZXMpOgorICAgICAgICAgICAgICAgIHByZXYgPSBxdW90ZShwcmV2KQorICAgICAgICAgICAgICAgIGlmIGxlbihlbmNvZGVkX2xpbmUpICsgbGVuKHByZXYpID4gbWF4bGluZWxlbjoKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZF9ib2R5ICs9IGVuY29kZWRfbGluZSArICc9JyArIGVvbCArIHByZXYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgcHJldgorICAgICAgICAgICAgIyBKdXN0IG5vcm1hbCB3aGl0ZXNwYWNlIGF0IGVuZCBvZiBsaW5lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUgKyBwcmV2ICsgJz0nICsgZW9sCisgICAgICAgICAgICBlbmNvZGVkX2xpbmUgPSAnJworICAgICAgICAjIE5vdyBsb29rIGF0IHRoZSBsaW5lIHdlIGp1c3QgZmluaXNoZWQgYW5kIGl0IGhhcyBhIGxpbmUgZW5kaW5nLCB3ZQorICAgICAgICAjIG5lZWQgdG8gYWRkIGVvbCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICAgICAgICBpZiBsaW5lc1tsaW5lbm9dLmVuZHN3aXRoKENSTEYpIG9yIGxpbmVzW2xpbmVub11bLTFdIGluIENSTEY6CisgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgZW9sCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lCisgICAgICAgIGVuY29kZWRfbGluZSA9ICcnCisgICAgcmV0dXJuIGVuY29kZWRfYm9keQorCisKKyMgRm9yIGNvbnZlbmllbmNlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3LyBzdGFuZGFyZCBiYXNlNjQgbW9kdWxlCitib2R5X2VuY29kZSA9IGVuY29kZQorZW5jb2Rlc3RyaW5nID0gZW5jb2RlCisKKworDAorIyBCQVc6IEknbSBub3Qgc3VyZSBpZiB0aGUgaW50ZW50IHdhcyBmb3IgdGhlIHNpZ25hdHVyZSBvZiB0aGlzIGZ1bmN0aW9uIHRvIGJlCisjIHRoZSBzYW1lIGFzIGJhc2U2NE1JTUUuZGVjb2RlKCkgb3Igbm90Li4uCitkZWYgZGVjb2RlKGVuY29kZWQsIGVvbD1OTCk6CisgICAgIiIiRGVjb2RlIGEgcXVvdGVkLXByaW50YWJsZSBzdHJpbmcuCisKKyAgICBMaW5lcyBhcmUgc2VwYXJhdGVkIHdpdGggZW9sLCB3aGljaCBkZWZhdWx0cyB0byBcXG4uCisgICAgIiIiCisgICAgaWYgbm90IGVuY29kZWQ6CisgICAgICAgIHJldHVybiBlbmNvZGVkCisgICAgIyBCQVc6IHNlZSBjb21tZW50IGluIGVuY29kZSgpIGFib3ZlLiAgQWdhaW4sIHdlJ3JlIGJ1aWxkaW5nIHVwIHRoZQorICAgICMgZGVjb2RlZCBzdHJpbmcgd2l0aCBzdHJpbmcgY29uY2F0ZW5hdGlvbiwgd2hpY2ggY291bGQgYmUgZG9uZSBtdWNoIG1vcmUKKyAgICAjIGVmZmljaWVudGx5LgorICAgIGRlY29kZWQgPSAnJworCisgICAgZm9yIGxpbmUgaW4gZW5jb2RlZC5zcGxpdGxpbmVzKCk6CisgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgZGVjb2RlZCArPSBlb2wKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaSA9IDAKKyAgICAgICAgbiA9IGxlbihsaW5lKQorICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgIGMgPSBsaW5lW2ldCisgICAgICAgICAgICBpZiBjIDw+ICc9JzoKKyAgICAgICAgICAgICAgICBkZWNvZGVkICs9IGMKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBjID09ICI9Ii4gIEFyZSB3ZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lPyAgSWYgc28sIGFkZAorICAgICAgICAgICAgIyBhIHNvZnQgbGluZSBicmVhay4KKyAgICAgICAgICAgIGVsaWYgaSsxID09IG46CisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgRGVjb2RlIGlmIGluIGZvcm0gPUFCCisgICAgICAgICAgICBlbGlmIGkrMiA8IG4gYW5kIGxpbmVbaSsxXSBpbiBoZXhkaWdpdHMgYW5kIGxpbmVbaSsyXSBpbiBoZXhkaWdpdHM6CisgICAgICAgICAgICAgICAgZGVjb2RlZCArPSB1bnF1b3RlKGxpbmVbaTppKzNdKQorICAgICAgICAgICAgICAgIGkgKz0gMworICAgICAgICAgICAgIyBPdGhlcndpc2UsIG5vdCBpbiBmb3JtID1BQiwgcGFzcyBsaXRlcmFsbHkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVjb2RlZCArPSBjCisgICAgICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgICAgIGlmIGkgPT0gbjoKKyAgICAgICAgICAgICAgICBkZWNvZGVkICs9IGVvbAorICAgICMgU3BlY2lhbCBjYXNlIGlmIG9yaWdpbmFsIHN0cmluZyBkaWQgbm90IGVuZCB3aXRoIGVvbAorICAgIGlmIGVuY29kZWRbLTFdIDw+IGVvbCBhbmQgZGVjb2RlZFstMV0gPT0gZW9sOgorICAgICAgICBkZWNvZGVkID0gZGVjb2RlZFs6LTFdCisgICAgcmV0dXJuIGRlY29kZWQKKworCisjIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdy8gc3RhbmRhcmQgYmFzZTY0IG1vZHVsZQorYm9keV9kZWNvZGUgPSBkZWNvZGUKK2RlY29kZXN0cmluZyA9IGRlY29kZQorCisKKwwKK2RlZiBfdW5xdW90ZV9tYXRjaChtYXRjaCk6CisgICAgIiIiVHVybiBhIG1hdGNoIGluIHRoZSBmb3JtID1BQiB0byB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggdmFsdWUgMHhhYiIiIgorICAgIHMgPSBtYXRjaC5ncm91cCgwKQorICAgIHJldHVybiB1bnF1b3RlKHMpCisKKworIyBIZWFkZXIgZGVjb2RpbmcgaXMgZG9uZSBhIGJpdCBkaWZmZXJlbnRseQorZGVmIGhlYWRlcl9kZWNvZGUocyk6CisgICAgIiIiRGVjb2RlIGEgc3RyaW5nIGVuY29kZWQgd2l0aCBSRkMgMjA0NSBNSU1FIGhlYWRlciBgUScgZW5jb2RpbmcuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBhcnNlIGEgZnVsbCBNSU1FIGhlYWRlciB2YWx1ZSBlbmNvZGVkIHdpdGgKKyAgICBxdW90ZWQtcHJpbnRhYmxlIChsaWtlID0/aXNvLTg4OTUtMT9xP0hlbGxvX1dvcmxkPz0pIC0tIHBsZWFzZSB1c2UKKyAgICB0aGUgaGlnaCBsZXZlbCBlbWFpbC5IZWFkZXIgY2xhc3MgZm9yIHRoYXQgZnVuY3Rpb25hbGl0eS4KKyAgICAiIiIKKyAgICBzID0gcy5yZXBsYWNlKCdfJywgJyAnKQorICAgIHJldHVybiByZS5zdWIocic9XHd7Mn0nLCBfdW5xdW90ZV9tYXRjaCwgcykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2RhdGEvbXNnXzI0LnR4dCBiL0xpYi90ZXN0L2RhdGEvbXNnXzI0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUyMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvZGF0YS9tc2dfMjQudHh0CkBAIC0wLDAgKzEsMTAgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZGF0YS9tc2dfMjUudHh0IGIvTGliL3Rlc3QvZGF0YS9tc2dfMjUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzUyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9kYXRhL21zZ18yNS50eHQKQEAgLTAsMCArMSwxMTcgQEAKK0Zyb20gTUFJTEVSLURBRU1PTiBGcmkgQXByIDA2IDE2OjQ2OjA5IDIwMDEKK1JlY2VpdmVkOiBmcm9tIFsyMDQuMjQ1LjE5OS45OF0gKGhlbG89emluZmFuZGVsLmxhY2l0YS5jb20pCisJYnkgd3d3LmxpbnV4Lm9yZy51ayB3aXRoIGVzbXRwIChFeGltIDMuMTMgIzEpCisJaWQgMTRsWVI2LTAwMDhJdi0wMAorCWZvciBsaW51eHVzZXItYWRtaW5Ad3d3LmxpbnV4Lm9yZy51azsgRnJpLCAwNiBBcHIgMjAwMSAxNjo0NjowOSArMDEwMAorUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsb2NhbGhvc3QpIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIGludGVybmFsIGlkIEpBQjAzMjI1OyBGcmksIDYgQXByIDIwMDEgMDk6MjM6MDYgLTA4MDAgKEdNVC0wODAwKQorRGF0ZTogRnJpLCA2IEFwciAyMDAxIDA5OjIzOjA2IC0wODAwIChHTVQtMDgwMCkKK0Zyb206IE1haWwgRGVsaXZlcnkgU3Vic3lzdGVtIDxNQUlMRVItREFFTU9OQHppbmZhbmRlbC5sYWNpdGEuY29tPgorU3ViamVjdDogUmV0dXJuZWQgbWFpbDogVG9vIG1hbnkgaG9wcyAxOSAoMTcgbWF4KTogZnJvbSA8bGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWs+IHZpYSBbMTk5LjE2NC4yMzUuMjI2XSwgdG8gPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT4KK01lc3NhZ2UtSWQ6IDwyMDAxMDQwNjE3MjMuSkFCMDMyMjVAemluZmFuZGVsLmxhY2l0YS5jb20+CitUbzogPGxpbnV4dXNlci1hZG1pbkB3d3cubGludXgub3JnLnVrPgorVG86IHBvc3RtYXN0ZXJAemluZmFuZGVsLmxhY2l0YS5jb20KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9yZXBvcnQ7IHJlcG9ydC10eXBlPWRlbGl2ZXJ5LXN0YXR1czsKKwlibworQXV0by1TdWJtaXR0ZWQ6IGF1dG8tZ2VuZXJhdGVkIChmYWlsdXJlKQorCitUaGlzIGlzIGEgTUlNRS1lbmNhcHN1bGF0ZWQgbWVzc2FnZQorCistLUpBQjAzMjI1Ljk4NjU3Nzc4Ni96aW5mYW5kZWwubGFjaXRhLmNvbQorCitUaGUgb3JpZ2luYWwgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgYXQgRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKK2Zyb20gWzE5OS4xNjQuMjM1LjIyNl0KKworICAgLS0tLS0gVGhlIGZvbGxvd2luZyBhZGRyZXNzZXMgaGF2ZSBkZWxpdmVyeSBub3RpZmljYXRpb25zIC0tLS0tCis8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPiAgKHVucmVjb3ZlcmFibGUgZXJyb3IpCisKKyAgIC0tLS0tIFRyYW5zY3JpcHQgb2Ygc2Vzc2lvbiBmb2xsb3dzIC0tLS0tCis1NTQgVG9vIG1hbnkgaG9wcyAxOSAoMTcgbWF4KTogZnJvbSA8bGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWs+IHZpYSBbMTk5LjE2NC4yMzUuMjI2XSwgdG8gPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT4KKworLS1KQUIwMzIyNS45ODY1Nzc3ODYvemluZmFuZGVsLmxhY2l0YS5jb20KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKworUmVwb3J0aW5nLU1UQTogZG5zOyB6aW5mYW5kZWwubGFjaXRhLmNvbQorUmVjZWl2ZWQtRnJvbS1NVEE6IGRuczsgWzE5OS4xNjQuMjM1LjIyNl0KK0Fycml2YWwtRGF0ZTogRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbQorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS40LjYKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDYgQXByIDIwMDEgMDk6MjM6MDYgLTA4MDAgKEdNVC0wODAwKQorCistLUpBQjAzMjI1Ljk4NjU3Nzc4Ni96aW5mYW5kZWwubGFjaXRhLmNvbQorQ29udGVudC1UeXBlOiB0ZXh0L3JmYzgyMi1oZWFkZXJzCisKK1JldHVybi1QYXRoOiBsaW51eHVzZXItYWRtaW5Ad3d3LmxpbnV4Lm9yZy51aworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjI1IGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIyMSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMjoxOCAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMTcgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MjE6MzcgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjEzIGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjIwOjU2IC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIwOSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMDoxNSAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMDUgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MTk6MzMgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjAxIGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjE4OjUyIC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzE5NyBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToxNzo1NCAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB3d3cubGludXgub3JnLnVrIChwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWsgWzE5NS45Mi4yNDkuMjUyXSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBsb2NhbGhvc3QubG9jYWxkb21haW4KKwkoWworCWJ5CisJaWQKK1JlY2VpdmVkOiBmcm9tIFsyMTIuMS4xMzAuMTFdIChoZWxvPXMxLnVrbGludXgubmV0IGlkZW50PXJvb3QpCisJYnkKKwlpZAorCWZvCitSZWNlaXZlZDogZnJvbSBzZXJ2ZXIgKHBwcC0yLTIyLmN2eDQudGVsaW5jby5uZXQgWzIxMi4xLjE0OS4yMl0pCisJYnkKKwlmbworRnJvbTogRGFuaWVsIEphbWVzIDxkYW5pZWxAbGludXh1c2VyLmNvLnVrPgorT3JnYW5pemF0aW9uOiBMaW51eFVzZXIKK1RvOiBsaW51eHVzZXJAd3d3LmxpbnV4Lm9yZy51aworWC1NYWlsZXI6IEtNYWlsIFt2ZXJzaW9uIDEuMS45OV0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKKyAgYworTUlNRS1WZXJzaW9uOiAxLjAKK01lc3NhZ2UtSWQ6IDwwMTA0MDYxNjAzMzkwMy4wMDk2MkBzZXJ2ZXI+CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitTdWJqZWN0OiBbTGludXhVc2VyXSBidWxsZXRpbiBuby4gNDUKK1NlbmRlcjogbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWsKK0Vycm9ycy1UbzogbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWsKK1gtQmVlblRoZXJlOiBsaW51eHVzZXJAd3d3LmxpbnV4Lm9yZy51aworWC1NYWlsbWFuLVZlcnNpb246IDIuMC4zCitQcmVjZWRlbmNlOiBidWxrCitMaXN0LUhlbHA6IDxtYWlsdG86bGludXh1c2VyLXJlcXVlc3RAd3d3LmxpbnV4Lm9yZy51az9zdWJqZWN0PWhlbHA+CitMaXN0LVBvc3Q6IDxtYWlsdG86bGludXh1c2VyQHd3dy5saW51eC5vcmcudWs+CitMaXN0LVN1YnNjcmliZTogPGh0dHA6Ly93d3cubGludXgub3JnLnVrL21haWxtYW4vbGlzdGluZm8vbGludXh1c2VyPiwKKwk8bQorTGlzdC1JZDogYnVsbGV0aW5zIGZyb20gTGludXhVc2VyIG1hZ2F6aW5lIDxsaW51eHVzZXIud3d3LmxpbnV4Lm9yZy51az4KK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwOi8vd3d3LmxpbnV4Lm9yZy51ay9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4dXNlcj4sCisJPG0KK0xpc3QtQXJjaGl2ZTogPGh0dHA6Ly93d3cubGludXgub3JnLnVrL3BpcGVybWFpbC9saW51eHVzZXIvPgorRGF0ZTogRnJpLCA2IEFwciAyMDAxIDE2OjAzOjM5ICswMTAwCisKKy0tSkFCMDMyMjUuOTg2NTc3Nzg2L3ppbmZhbmRlbC5sYWNpdGEuY29tLS0KKworCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC5weQppbmRleCA3MTA1ZjdkLi4xMzIyMjQ2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwucHkKQEAgLTEsMTUgKzEsMTkgQEAKICMgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzCiAKK2ltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGJhc2U2NAogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHR5cGVzIGltcG9ydCBTdHJpbmdUeXBlCitpbXBvcnQgd2FybmluZ3MKIAogaW1wb3J0IGVtYWlsCiAKK2Zyb20gZW1haWwuQ2hhcnNldCBpbXBvcnQgQ2hhcnNldAorZnJvbSBlbWFpbC5IZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlcgogZnJvbSBlbWFpbC5QYXJzZXIgaW1wb3J0IFBhcnNlciwgSGVhZGVyUGFyc2VyCiBmcm9tIGVtYWlsLkdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yLCBEZWNvZGVkR2VuZXJhdG9yCiBmcm9tIGVtYWlsLk1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKQEAgLTIyLDE0ICsyNiwxOCBAQAogZnJvbSBlbWFpbCBpbXBvcnQgRXJyb3JzCiBmcm9tIGVtYWlsIGltcG9ydCBFbmNvZGVycwogZnJvbSBlbWFpbCBpbXBvcnQgSXRlcmF0b3JzCitmcm9tIGVtYWlsIGltcG9ydCBiYXNlNjRNSU1FCitmcm9tIGVtYWlsIGltcG9ydCBxdW9wcmlNSU1FCiAKIGZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgX19maWxlX18gYXMgdGVzdF9zdXBwb3J0X2ZpbGUKIAotCiBOTCA9ICdcbicKIEVNUFRZU1RSSU5HID0gJycKIFNQQUNFID0gJyAnCiAKKyMgV2UgZG9uJ3QgY2FyZSBhYm91dCBEZXByZWNhdGlvbldhcm5pbmdzCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgJycsIERlcHJlY2F0aW9uV2FybmluZywgX19uYW1lX18pCisKIAogDAogZGVmIG9wZW5maWxlKGZpbGVuYW1lKToKQEAgLTQxLDcgKzQ5LDcgQEAKICMgQmFzZSB0ZXN0IGNsYXNzCiBjbGFzcyBUZXN0RW1haWxCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6Ci0gICAgICAgIGZwID0gb3BlbmZpbGUoZmlsZW5hbWUpCisgICAgICAgIGZwID0gb3BlbmZpbGUoZmluZGZpbGUoZmlsZW5hbWUpKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKICAgICAgICAgZmluYWxseToKQEAgLTU4LDYgKzY2LDQ1IEBACiAgICAgICAgIGVxKG1zZy5nZXRfYWxsKCdjYycpLCBbJ2NjY0B6enoub3JnJywgJ2RkZEB6enoub3JnJywgJ2VlZUB6enoub3JnJ10pCiAgICAgICAgIGVxKG1zZy5nZXRfYWxsKCd4eCcsICduL2EnKSwgJ24vYScpCiAKKyAgICBkZWYgdGVzdF9nZXRzZXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgZXEobXNnWydtaW1lLXZlcnNpb24nXSwgJzEuMCcpCisgICAgICAgIGVxKG1zZy5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisgICAgICAgICMgUmVtb3ZlIHRoZSBjaGFyc2V0CisgICAgICAgIG1zZy5zZXRfY2hhcnNldChOb25lKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIFRyeSBhZGRpbmcgYSBjaGFyc2V0IHdoZW4gdGhlcmUncyBhbHJlYWR5IE1JTUUgaGVhZGVycyBwcmVzZW50CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ01JTUUtVmVyc2lvbiddID0gJzIuMCcKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3gtd2VpcmQnCisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3F1aW50ZWQtcHVudGFibGUnCisgICAgICAgIG1zZy5zZXRfY2hhcnNldChjaGFyc2V0KQorICAgICAgICBlcShtc2dbJ21pbWUtdmVyc2lvbiddLCAnMi4wJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQveC13ZWlyZDsgY2hhcnNldD0iaXNvLTg4NTktMSInKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1aW50ZWQtcHVudGFibGUnKQorCisgICAgZGVmIHRlc3Rfc2V0X2NoYXJzZXRfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisgICAgZGVmIHRlc3Rfc2V0X3BheWxvYWRfd2l0aF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1RoaXMgaXMgYSBzdHJpbmcgcGF5bG9hZCcsIGNoYXJzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ2lzby04ODU5LTEnKQorCiAgICAgZGVmIHRlc3RfZ2V0X2NoYXJzZXRzKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKIApAQCAtMjA0LDYgKzI1MSwxMSBAQAogICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCiAgICAgICAgICAgIFsoJ2ZvbycsICcnKSwgKCdiYXInLCAnb25lJyksICgnYmF6JywgJ3R3bycpXSkKIAorICAgIGRlZiB0ZXN0X2dldF9wYXJhbV9saWJlcmFsKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICdDb250ZW50LVR5cGU6IE11bHRpcGFydC9taXhlZDsgYm91bmRhcnkgPSAiQ1BJTVNTTVRQQzA2cDVmM3RHIicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdib3VuZGFyeScpLCAnQ1BJTVNTTVRQQzA2cDVmM3RHJykKKwogICAgIGRlZiB0ZXN0X2dldF9wYXJhbShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCkBAIC0yMTYsNiArMjY4LDEwIEBACiAgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ZvbycsIGhlYWRlcj0neC1oZWFkZXInKSwgJycpCiAgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JhcicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ29uZScpCiAgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JheicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ3R3bycpCisgICAgICAgICMgWFhYOiBXZSBhcmUgbm90IFJGQy0yMDQ1IGNvbXBsaWFudCEgIFdlIGNhbm5vdCBwYXJzZToKKyAgICAgICAgIyBtc2dbIkNvbnRlbnQtVHlwZSJdID0gJ3RleHQvcGxhaW47IHdlaXJkPSJoZXk7IGRvbGx5PyBbeW91XSBAIDxcXCJob21lXFwiPj8iJworICAgICAgICAjIG1zZy5nZXRfcGFyYW0oIndlaXJkIikKKyAgICAgICAgIyB5ZXQuCiAKICAgICBkZWYgdGVzdF9nZXRfcGFyYW1fZnVua3lfY29udGludWF0aW9uX2xpbmVzKHNlbGYpOgogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMi50eHQnKQpAQCAtMjI4LDcgKzI4NCw1MiBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3MobXNnLmhhc19rZXkoJ0hFQURFUicpKQogICAgICAgICBzZWxmLmZhaWxJZihtc2cuaGFzX2tleSgnaGVhZGVyaScpKQogCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICdpc28tMjAyMi1qcCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ltcG9ydGFuY2UnKSwgJ2hpZ2ggdmFsdWUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdpbXBvcnRhbmNlJywgdW5xdW90ZT0wKSwgJyJoaWdoIHZhbHVlIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIFsoJ3RleHQvcGxhaW4nLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW1wb3J0YW5jZScsICdoaWdoIHZhbHVlJyldKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyh1bnF1b3RlPTApLCBbKCd0ZXh0L3BsYWluJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjaGFyc2V0JywgJyJpc28tMjAyMi1qcCInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW1wb3J0YW5jZScsICciaGlnaCB2YWx1ZSInKV0pCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTk5OTkteHgnLCBoZWFkZXI9J1gtSmltbXknKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JywgaGVhZGVyPSdYLUppbW15JyksICdpc28tOTk5OS14eCcpCiAKKyAgICBkZWYgdGVzdF9kZWxfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLCAoJ3JlcG9ydC10eXBlJywgJ2RlbGl2ZXJ5LXN0YXR1cycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyldKQorICAgICAgICBvbGRfdmFsID0gbXNnLmdldF9wYXJhbSgicmVwb3J0LXR5cGUiKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCJyZXBvcnQtdHlwZSIpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKV0pIAorICAgICAgICBtc2cuc2V0X3BhcmFtKCJyZXBvcnQtdHlwZSIsIG9sZF92YWwpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKSwKKyAgICAgICAgICAgICgncmVwb3J0LXR5cGUnLCBvbGRfdmFsKV0pCisKKyAgICBkZWYgdGVzdF9zZXRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtc2cuc2V0X3R5cGUsICd0ZXh0JykKKyAgICAgICAgbXNnLnNldF90eXBlKCd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisgICAgICAgIG1zZy5zZXRfdHlwZSgndGV4dC9odG1sJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvaHRtbDsgY2hhcnNldD0idXMtYXNjaWkiJykKKworICAgICAgICAgICAKIAwKICMgVGVzdCB0aGUgZW1haWwuRW5jb2RlcnMgbW9kdWxlCiBjbGFzcyBUZXN0RW5jb2RlcnModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMjM2LDcgKzMzNyw2IEBACiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnLCBfZW5jb2Rlcj1FbmNvZGVycy5lbmNvZGVfbm9vcCkKICAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB3b3JsZFxuJykKLSAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sIE5vbmUpCiAKICAgICBkZWYgdGVzdF9lbmNvZGVfN2JpdChzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0yNTMsNiArMzUzLDEyIEBACiAgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gXHg4MCB3b3JsZFxuJykKICAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc4Yml0JykKIAorICAgIGRlZiB0ZXN0X2VuY29kZV9lbXB0eV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfY2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCiAgICAgZGVmIHRlc3RfZW5jb2RlX2Jhc2U2NChzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcsIF9lbmNvZGVyPUVuY29kZXJzLmVuY29kZV9iYXNlNjQpCkBAIC0yNjUsNiArMzcxLDIzIEBACiAgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG89MjB3b3JsZFxuJykKICAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdxdW90ZWQtcHJpbnRhYmxlJykKIAorICAgIGRlZiB0ZXN0X2RlZmF1bHRfY3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfY3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBXaXRoIG5vIGV4cGxpY2l0IF9jaGFyc2V0IGl0cyB1cy1hc2NpaSwgYW5kIGFsbCBhcmUgNy1iaXQKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKyAgICAgICAgIyBTaW1pbGFyLCBidXQgd2l0aCA4LWJpdCBkYXRhCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc4Yml0JykKKyAgICAgICAgIyBBbmQgbm93IHdpdGggYSBkaWZmZXJlbnQgY2hhcnNldAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gXHhmOCB3b3JsZCcsIF9jaGFyc2V0PSdpc28tODg1OS0xJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdxdW90ZWQtcHJpbnRhYmxlJykKKwogCiAMCiAjIFRlc3QgbG9uZyBoZWFkZXIgd3JhcHBpbmcKQEAgLTI3OSw3ICs0MDIsMTQgQEAKICAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQogICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKICAgICAgICAgZyhtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2ZwLmdldHZhbHVlKCksIG9wZW5maWxlKCdtc2dfMTgudHh0JykucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNmcC5nZXR2YWx1ZSgpLCAnJydcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQ6IHdhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7CisJc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiCisKKycnJykKIAogICAgIGRlZiB0ZXN0X25vX3NlbWlzX2hlYWRlcl9zcGxpdHRlcihzZWxmKToKICAgICAgICAgbXNnID0gTWVzc2FnZSgpCkBAIC0zMTQsNiArNDQ0LDMwIEBACiAKIFRlc3QiIiIpCiAKKyAgICBkZWYgdGVzdF9zcGxpdHRpbmdfbXVsdGlwbGVfbG9uZ19saW5lcyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQnXSA9ICIiIlwKK2Zyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorCWZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorCWZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZWNlaXZlZDogZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKKwlieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworCWZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CisJU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCisJZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKKwlieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworCWZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CisJU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCisJZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKKwlieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworCWZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CisJU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCisKKworIiIiKQorCiAKIAwKICMgVGVzdCBtYW5nbGluZyBvZiAiRnJvbSAiIGxpbmVzIGluIHRoZSBib2R5IG9mIGEgbWVzc2FnZQpAQCAtNDc2LDYgKzYzMCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmVcbicpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2VsZi5fbXNnLmlzX211bHRpcGFydCgpKQogCisgICAgZGVmIHRlc3RfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB0aGVyZScsIF9jaGFyc2V0PSd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCiAKIAwKICMgVGVzdCBhIG1vcmUgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0L21peGVkIHR5cGUgbWVzc2FnZQpAQCAtNTM5LDYgKzY5OSw4MiBAQAogICAgICAgICB1bmxlc3Mobm90IG0wLmlzX211bHRpcGFydCgpKQogICAgICAgICB1bmxlc3Mobm90IG0xLmlzX211bHRpcGFydCgpKQogCisgICAgZGVmIHRlc3Rfbm9fcGFydHNfaW5fYV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9ICcnCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorCisKKy0tQk9VTkRBUlktLQorJycnKSAgICAgICAgCisKKyAgICBkZWYgdGVzdF9vbmVfcGFydF9pbl9hX211bHRpcGFydChzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gJycKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnJworICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKworLS1CT1VOREFSWS0tCisnJycpICAgICAgICAKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydChzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gJycKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKworLS1CT1VOREFSWS0tCisnJycpICAgICAgICAKKwogCiAMCiAjIFRlc3Qgc29tZSBiYWRseSBmb3JtYXR0ZWQgbWVzc2FnZXMKQEAgLTU1MSw3ICs3ODcsNyBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3MobXNnLmdldF9zdWJ0eXBlKCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X2JvZ3VzX2JvdW5kYXJ5KHNlbGYpOgotICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMTUudHh0JykKKyAgICAgICAgZnAgPSBvcGVuZmlsZShmaW5kZmlsZSgnbXNnXzE1LnR4dCcpKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCiAgICAgICAgIGZpbmFsbHk6CkBAIC01NjEsNiArNzk3LDEwIEBACiAgICAgICAgICMgbWVzc2FnZSBpbnRvIHRoZSBpbnRlbmRlZCBtZXNzYWdlIHRyZWUuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVycm9ycy5Cb3VuZGFyeUVycm9yLCBwLnBhcnNlc3RyLCBkYXRhKQogCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbmRmaWxlKCdtc2dfMjUudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVycm9ycy5Cb3VuZGFyeUVycm9yLCBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZSwgZnApCisKIAogDAogIyBUZXN0IFJGQyAyMDQ3IGhlYWRlciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKQEAgLTU3MCw3ICs4MTAsNyBAQAogICAgICAgICBzID0gJz0/aXNvLTg4NTktMT9xP3RoaXM9MjBpcz0yMHNvbWU9MjB0ZXh0Pz0nCiAgICAgICAgIGVxKFV0aWxzLmRlY29kZShzKSwgJ3RoaXMgaXMgc29tZSB0ZXh0JykKICAgICAgICAgcyA9ICc9P0lTTy04ODU5LTE/UT9LZWxkX0o9Rjhybl9TaW1vbnNlbj89JwotICAgICAgICBlcShVdGlscy5kZWNvZGUocyksIHUnS2VsZF9KXHhmOHJuX1NpbW9uc2VuJykKKyAgICAgICAgZXEoVXRpbHMuZGVjb2RlKHMpLCB1J0tlbGQgSlx4ZjhybiBTaW1vbnNlbicpCiAgICAgICAgIHMgPSAnPT9JU08tODg1OS0xP0I/U1dZZ2VXOTFJR05oYmlCeVpXRmtJSFJvYVhNZ2VXOD0/PScgXAogICAgICAgICAgICAgJz0/SVNPLTg4NTktMj9CP2RTQjFibVJsY25OMFlXNWtJSFJvWlNCbGVHRnRjR3hsTGc9PT89JwogICAgICAgICBlcShVdGlscy5kZWNvZGUocyksICdJZiB5b3UgY2FuIHJlYWQgdGhpcyB5b3UgdW5kZXJzdGFuZCB0aGUgZXhhbXBsZS4nKQpAQCAtNTc4LDYgKzgxOCw4IEBACiAgICAgICAgIGVxKFV0aWxzLmRlY29kZShzKSwKICAgICAgICAgICAgdSdcdTA1ZGRcdTA1ZDVcdTA1ZGNcdTA1ZTkgXHUwNWRmXHUwNWQxIFx1MDVkOVx1MDVkY1x1MDVkOFx1MDVlNFx1MDVlMCcpCiAgICAgICAgIHMgPSAnPT9pc28tODg1OS0xP3E/dGhpcz0yMGlzPz0gPT9pc28tODg1OS0xP3E/c29tZT0yMHRleHQ/PScKKyAgICAgICAgZXEoVXRpbHMuZGVjb2RlKHMpLCB1J3RoaXMgaXNzb21lIHRleHQnKQorICAgICAgICBzID0gJz0/aXNvLTg4NTktMT9xP3RoaXM9MjBpc18/PSA9P2lzby04ODU5LTE/cT9zb21lPTIwdGV4dD89JwogICAgICAgICBlcShVdGlscy5kZWNvZGUocyksIHUndGhpcyBpcyBzb21lIHRleHQnKQogCiAgICAgZGVmIHRlc3RfZW5jb2RlX2hlYWRlcihzZWxmKToKQEAgLTc5NCw2ICsxMDM2LDEwIEBACiAgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIzLnR4dCcpCiAgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQogCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX3BhcnRzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKwogICAgIGRlZiB0ZXN0X2NvbnRlbnRfdHlwZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscwogICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cwpAQCAtODM1LDcgKzEwODEsNiBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIFN0cmluZ1R5cGUpKQogICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdcbicpCiAKLQogDAogIyBUZXN0IHZhcmlvdXMgb3RoZXIgYml0cyBvZiB0aGUgcGFja2FnZSdzIGZ1bmN0aW9uYWxpdHkKIGNsYXNzIFRlc3RNaXNjZWxsYW5lb3VzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTkxNiw0OSArMTE2MSw3NyBAQAogICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKCdlbWFpbCcpCiAgICAgICAgIGFsbCA9IG1vZHVsZS5fX2FsbF9fCiAgICAgICAgIGFsbC5zb3J0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwsIFsnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsICdJdGVyYXRvcnMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNSU1FQXVkaW8nLCAnTUlNRUJhc2UnLCAnTUlNRUltYWdlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUlNRU1lc3NhZ2UnLCAnTUlNRVRleHQnLCAnTWVzc2FnZScsICdQYXJzZXInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVdGlscycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2VfZnJvbV9maWxlJywgJ21lc3NhZ2VfZnJvbV9zdHJpbmcnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwsIFsnQ2hhcnNldCcsICdFbmNvZGVycycsICdFcnJvcnMnLCAnR2VuZXJhdG9yJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hlYWRlcicsICdJdGVyYXRvcnMnLCAnTUlNRUF1ZGlvJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01JTUVCYXNlJywgJ01JTUVJbWFnZScsICdNSU1FTWVzc2FnZScsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNSU1FVGV4dCcsICdNZXNzYWdlJywgJ1BhcnNlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1V0aWxzJywgJ2Jhc2U2NE1JTUUnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZV9mcm9tX2ZpbGUnLCAnbWVzc2FnZV9mcm9tX3N0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1b3ByaU1JTUUnXSkKIAogICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGUoc2VsZik6Ci0gICAgICAgIG5vdyA9IDEwMDUzMjcyMzIuMTA5ODg0Ci0gICAgICAgIGdtX2Vwb2NoID0gdGltZS5nbXRpbWUoMClbMDozXQotICAgICAgICBsb2NfZXBvY2ggPSB0aW1lLmxvY2FsdGltZSgwKVswOjNdCi0gICAgICAgICMgV2hlbiBkb2VzIHRoZSBlcG9jaCBzdGFydD8KLSAgICAgICAgaWYgZ21fZXBvY2ggPT0gKDE5NzAsIDEsIDEpOgotICAgICAgICAgICAgIyB0cmFkaXRpb25hbCBVbml4IGVwb2NoCi0gICAgICAgICAgICBtYXRjaGRhdGUgPSAnRnJpLCAwOSBOb3YgMjAwMSAxNzozMzo1MiAtMDAwMCcKLSAgICAgICAgZWxpZiBsb2NfZXBvY2ggPT0gKDE5MDQsIDEsIDEpOgotICAgICAgICAgICAgIyBNYWMgZXBvY2gKLSAgICAgICAgICAgIG1hdGNoZGF0ZSA9ICdTYXQsIDA5IE5vdiAxOTM1IDE2OjMzOjUyIC0wMDAwJwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbWF0Y2hkYXRlID0gIkkgZG9uJ3QgdW5kZXJzdGFuZCB5b3VyIGVwb2NoIgotICAgICAgICBnZGF0ZSA9IFV0aWxzLmZvcm1hdGRhdGUobm93KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkYXRlLCBtYXRjaGRhdGUpCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VkYXRlKFV0aWxzLmZvcm1hdGRhdGUobm93KSlbOjZdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKG5vdylbOjZdKQogCiAgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV9sb2NhbHRpbWUoc2VsZik6Ci0gICAgICAgIG5vdyA9IDEwMDUzMjcyMzIuMTA5ODg0Ci0gICAgICAgIGxkYXRlID0gVXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT0xKQotICAgICAgICB6b25lID0gbGRhdGUuc3BsaXQoKVs1XQotICAgICAgICBvZmZzZXQgPSBpbnQoem9uZVsxOjNdKSAqIDM2MDAgKyBpbnQoem9uZVstMjpdKSAqIDYwCi0gICAgICAgICMgUmVtZW1iZXIgb2Zmc2V0IGlzIGluIHNlY29uZHMgd2VzdCBvZiBVVEMsIGJ1dCB0aGUgdGltZXpvbmUgaXMgaW4KLSAgICAgICAgIyBtaW51dGVzIGVhc3Qgb2YgVVRDLCBzbyB0aGUgc2lnbnMgZGlmZmVyLgotICAgICAgICBpZiB6b25lWzBdID09ICcrJzoKLSAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQKLSAgICAgICAgaWYgdGltZS5kYXlsaWdodCBhbmQgdGltZS5sb2NhbHRpbWUobm93KVstMV06Ci0gICAgICAgICAgICB0b2ZmID0gdGltZS5hbHR6b25lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0b2ZmID0gdGltZS50aW1lem9uZQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9mZnNldCwgdG9mZikKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFV0aWxzLnBhcnNlZGF0ZShVdGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPTEpKVs6Nl0sCisgICAgICAgICAgICB0aW1lLmxvY2FsdGltZShub3cpWzo2XSkKIAogICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub25lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlZGF0ZSgnJyksIE5vbmUpCiAKICAgICBkZWYgdGVzdF9wYXJzZWFkZHJfZW1wdHkoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VhZGRyKCc8PicpLCAoJycsICcnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5kdW1wX2FkZHJlc3NfcGFpcihVdGlscy5wYXJzZWFkZHIoJzw+JykpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5mb3JtYXRhZGRyKFV0aWxzLnBhcnNlYWRkcignPD4nKSksICcnKQorCisgICAgZGVmIHRlc3Rfbm9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgVXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgJ0EgU2lsbHkgUGVyc29uIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBVdGlscy5mb3JtYXRhZGRyKCgnQSAoVmVyeSkgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBcKFZlcnlcKSBTaWxseSBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBIFwoU3BlY2lhbFwpIFBlcnNvbicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5wYXJzZWFkZHIoVXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfcXVvdGVfZHVtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFV0aWxzLmZvcm1hdGFkZHIoKCdBIFNpbGx5OyBQZXJzb24nLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBIFNpbGx5OyBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZml4X2VvbHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShVdGlscy5maXhfZW9scygnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoVXRpbHMuZml4X2VvbHMoJ2hlbGxvXG4nKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKFV0aWxzLmZpeF9lb2xzKCdoZWxsb1xyJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcShVdGlscy5maXhfZW9scygnaGVsbG9cclxuJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcShVdGlscy5maXhfZW9scygnaGVsbG9cblxyJyksICdoZWxsb1xyXG5cclxuJykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRfcmljaGNvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmUgPSBzZWxmLmZhaWxJZkVxdWFsCisgICAgICAgIGNzZXQxID0gQ2hhcnNldCgpCisgICAgICAgIGNzZXQyID0gQ2hhcnNldCgpCisgICAgICAgIGVxKGNzZXQxLCAndXMtYXNjaWknKQorICAgICAgICBlcShjc2V0MSwgJ1VTLUFTQ0lJJykKKyAgICAgICAgZXEoY3NldDEsICdVcy1Bc0NpSScpCisgICAgICAgIGVxKCd1cy1hc2NpaScsIGNzZXQxKQorICAgICAgICBlcSgnVVMtQVNDSUknLCBjc2V0MSkKKyAgICAgICAgZXEoJ1VzLUFzQ2lJJywgY3NldDEpCisgICAgICAgIG5lKGNzZXQxLCAndXNhc2NpaScpCisgICAgICAgIG5lKGNzZXQxLCAnVVNBU0NJSScpCisgICAgICAgIG5lKGNzZXQxLCAnVXNBc0NpSScpCisgICAgICAgIG5lKCd1c2FzY2lpJywgY3NldDEpCisgICAgICAgIG5lKCdVU0FTQ0lJJywgY3NldDEpCisgICAgICAgIG5lKCdVc0FzQ2lJJywgY3NldDEpCisgICAgICAgIGVxKGNzZXQxLCBjc2V0MikKKyAgICAgICAgZXEoY3NldDIsIGNzZXQxKQogCiAKIAwKQEAgLTk4Myw4ICsxMjU2LDEyIEBACiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQogICAgICAgICBpdCA9IEl0ZXJhdG9ycy50eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKG1zZywgJ3RleHQnKQotICAgICAgICBsaW5lcyA9IFtzdWJwYXJ0LmdldF9wYXlsb2FkKCkgZm9yIHN1YnBhcnQgaW4gaXRdCi0gICAgICAgIGVxKGxlbihsaW5lcyksIDIpCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgc3VicGFydHMgPSAwCisgICAgICAgIGZvciBzdWJwYXJ0IGluIGl0OgorICAgICAgICAgICAgc3VicGFydHMgKz0gMQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgZXEoc3VicGFydHMsIDIpCiAgICAgICAgIGVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCAiIiJcCiBhIHNpbXBsZSBraW5kIG9mIG1pcnJvcgogdG8gcmVmbGVjdCB1cG9uIG91ciBvd24KQEAgLTEwMTEsNiArMTI4OCw3IEBACiAtTWUKICIiIikKIAorCiAMCiBjbGFzcyBUZXN0UGFyc2Vycyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfaGVhZGVyX3BhcnNlcihzZWxmKToKQEAgLTEwMjUsNiArMTMwMywyNzQgQEAKICAgICAgICAgZXEobXNnLmlzX211bHRpcGFydCgpLCAwKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgU3RyaW5nVHlwZSkpCiAKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2NvbnRpbnVhdG9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG1lc3NhZ2UgY29udGFpbnMgYSBsaW5lIGFmdGVyIHRoZSBTdWJqZWN0OiBoZWFkZXIgdGhhdCBoYXMgb25seQorICAgICAgICAjIHdoaXRlc3BhY2UsIGJ1dCBpdCBpcyBub3QgZW1wdHkhCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CisgCitEYXRlOiBNb24sIDggQXByIDIwMDIgMTU6MDk6MTkgLTA0MDAKK01lc3NhZ2UtSUQ6IHNwYW0KKworSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHkKKyIiIikKKyAgICAgICAgZXEobXNnWydzdWJqZWN0J10sICd0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0XG4gJykKKyAgICAgICAgZXEobXNnWydtZXNzYWdlLWlkJ10sICdzcGFtJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICJIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keVxuIikKKworCisMCitjbGFzcyBUZXN0QmFzZTY0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRNSU1FLmJhc2U2NF9sZW4oJ2hlbGxvJyksCisgICAgICAgICAgIGxlbihiYXNlNjRNSU1FLmVuY29kZSgnaGVsbG8nLCBlb2w9JycpKSkKKyAgICAgICAgZm9yIHNpemUgaW4gcmFuZ2UoMTUpOgorICAgICAgICAgICAgaWYgICBzaXplID09IDAgOiBic2l6ZSA9IDAKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSAzIDogYnNpemUgPSA0CisgICAgICAgICAgICBlbGlmIHNpemUgPD0gNiA6IGJzaXplID0gOAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDkgOiBic2l6ZSA9IDEyCisgICAgICAgICAgICBlbGlmIHNpemUgPD0gMTI6IGJzaXplID0gMTYKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgIDogYnNpemUgPSAyMAorICAgICAgICAgICAgZXEoYmFzZTY0TUlNRS5iYXNlNjRfbGVuKCd4JypzaXplKSwgYnNpemUpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRNSU1FLmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjRNSU1FLmRlY29kZSgnYUdWc2JHOD0nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5kZWNvZGUoJ2FHVnNiRzg9JywgJ1gnKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5kZWNvZGUoJ2FHVnNiRzhOQ25kdmNteGtcbicsICdYJyksICdoZWxsb1h3b3JsZCcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRNSU1FLmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjRNSU1FLmVuY29kZSgnaGVsbG8nKSwgJ2FHVnNiRzg9XG4nKQorICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBmbGFnCisgICAgICAgIGVxKGJhc2U2NE1JTUUuZW5jb2RlKCdoZWxsb1xuJyksICdhR1ZzYkc4S1xuJykKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5lbmNvZGUoJ2hlbGxvXG4nLCAwKSwgJ2FHVnNiRzhOQ2c9PVxuJykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZworICAgICAgICBlcShiYXNlNjRNSU1FLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJQT09CisiIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGJhc2U2NE1JTUUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElBPT1ccgorIiIiKQorICAgICAgICAKKyAgICBkZWYgdGVzdF9oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaGUgPSBiYXNlNjRNSU1FLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZXEoaGUoJ2hlbGxvJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcpLCAnPT9pc28tODg1OS0xP2I/YUdWc2JHOE5DbmR2Y214az89JykKKyAgICAgICAgIyBUZXN0IHRoZSBjaGFyc2V0IG9wdGlvbgorICAgICAgICBlcShoZSgnaGVsbG8nLCBjaGFyc2V0PSdpc28tODg1OS0yJyksICc9P2lzby04ODU5LTI/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBrZWVwX2VvbHMgZmxhZworICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJywga2VlcF9lb2xzPTEpLAorICAgICAgICAgICAnPT9pc28tODg1OS0xP2I/YUdWc2JHOEtkMjl5YkdRPT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKKz0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9JSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIZz0/PQorID0/aXNvLTg4NTktMT9iP2VIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZz89IiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCis9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP0lIaDRlSGdnZUhoNGVDQjRlSGg0SUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnPz0iIiIpCisKKworDAorY2xhc3MgVGVzdFF1b3ByaSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnYScpLCBvcmQoJ3onKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdBJyksIG9yZCgnWicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJzAnKSwgb3JkKCc5JykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbJyEnLCAnKicsICcrJywgJy0nLCAnLycsICcgJ10KKyAgICAgICAgc2VsZi5obm9uID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZSgyNTYpIGlmIGNocih4KSBub3QgaW4gc2VsZi5obGl0XQorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuaGxpdCkgKyBsZW4oc2VsZi5obm9uKSA9PSAyNTYKKyAgICAgICAgc2VsZi5ibGl0ID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJyAnKSwgb3JkKCd+JykrMSldICsgWydcdCddCisgICAgICAgIHNlbGYuYmxpdC5yZW1vdmUoJz0nKQorICAgICAgICBzZWxmLmJub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmJsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5ibGl0KSArIGxlbihzZWxmLmJub24pID09IDI1NgorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgc2VsZi5mYWlsSWYocXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfYm9keV9xdW9wcmlfY2hlY2soc2VsZik6CisgICAgICAgIGZvciBjIGluIHNlbGYuYmxpdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKHF1b3ByaU1JTUUuYm9keV9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBocWwgPSBxdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfbGVuCisgICAgICAgIGVuYyA9IHF1b3ByaU1JTUUuaGVhZGVyX2VuY29kZQorICAgICAgICBmb3IgcyBpbiAoJ2hlbGxvJywgJ2hAZUBsQGxAb0AnKToKKyAgICAgICAgICAgICMgRW1wdHkgY2hhcnNldCBhbmQgbm8gbGluZS1lbmRpbmdzLiAgNyA9PSBSRkMgY2hyb21lCisgICAgICAgICAgICBlcShocWwocyksIGxlbihlbmMocywgY2hhcnNldD0nJywgZW9sPScnKSktNykKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgZXEoaHFsKGMpLCAxKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246CisgICAgICAgICAgICBlcShocWwoYyksIDMpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBicWwgPSBxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2xlbgorICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6CisgICAgICAgICAgICBlcShicWwoYyksIDEpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIGVxKGJxbChjKSwgMykKKworICAgIGRlZiB0ZXN0X3F1b3RlX3VucXVvdGVfaWRlbXBvdGVudChzZWxmKToKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGMgPSBjaHIoeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVvcHJpTUlNRS51bnF1b3RlKHF1b3ByaU1JTUUucXVvdGUoYykpLCBjKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhlID0gcXVvcHJpTUlNRS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGVxKGhlKCdoZWxsbycpLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBEPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCB0aGUgY2hhcnNldCBvcHRpb24KKyAgICAgICAgZXEoaGUoJ2hlbGxvJywgY2hhcnNldD0naXNvLTg4NTktMicpLCAnPT9pc28tODg1OS0yP3E/aGVsbG8/PScpCisgICAgICAgICMgVGVzdCB0aGUga2VlcF9lb2xzIGZsYWcKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcsIGtlZXBfZW9scz0xKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIKKyAgICAgICAgZXEoaGUoJ2hlbGxvx3RoZXJlJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz1DN3RoZXJlPz0nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorPT9pc28tODg1OS0xP3E/eHh4eF94eHh4X3h4eHhfeHh4eF94eD89CisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89CisgPT9pc28tODg1OS0xP3E/X3h4eHhfeHh4eF94eHh4X3h4eHhfeD89CisgPT9pc28tODg1OS0xP3E/eHh4X3h4eHhfeHh4eF94eHh4X3h4eD89CisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKKz0/aXNvLTg4NTktMT9xP3h4eHhfeHh4eF94eHh4X3h4eHhfeHg/PVxyCisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89XHIKKyA9P2lzby04ODU5LTE/cT9feHh4eF94eHh4X3h4eHhfeHh4eF94Pz1ccgorID0/aXNvLTg4NTktMT9xP3h4eF94eHh4X3h4eHhfeHh4eF94eHg/PVxyCisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmlNSU1FLmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmlNSU1FLmRlY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpTUlNRS5kZWNvZGUoJ2hlbGxvJywgJ1gnKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpTUlNRS5kZWNvZGUoJ2hlbGxvXG53b3JsZCcsICdYJyksICdoZWxsb1h3b3JsZCcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgZmxhZworICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgnaGVsbG9cclxud29ybGQnKSwgJ2hlbGxvXG53b3JsZCcpCisgICAgICAgIGVxKHF1b3ByaU1JTUUuZW5jb2RlKCdoZWxsb1xyXG53b3JsZCcsIDApLCAnaGVsbG9cbndvcmxkJykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZworICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCit4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHg9CisgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHg9Cit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKHF1b3ByaU1JTUUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKK3h4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eD1ccgorIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4PVxyCit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgIGVxKHF1b3ByaU1JTUUuZW5jb2RlKCIiIlwKK29uZSBsaW5lCisKK3R3byBsaW5lIiIiKSwgIiIiXAorb25lIGxpbmUKKwordHdvIGxpbmUiIiIpCisgICAgICAgIAorCisMCisjIFRlc3QgdGhlIENoYXJzZXQgY2xhc3MKK2NsYXNzIFRlc3RDaGFyc2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBNYWtlIHN1cmUgdXMtYXNjaWkgPSBubyBVbmljb2RlIGNvbnZlcnNpb24KKyAgICAgICAgYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgcyA9ICdIZWxsbyBXb3JsZCEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKyAgICAgICAgIyB0ZXN0IDgtYml0IGlkZW1wb3RlbmN5IHdpdGggdXMtYXNjaWkKKyAgICAgICAgcyA9ICdceGE0XHhhMlx4YTRceGE0XHhhNFx4YTZceGE0XHhhOFx4YTRceGFhJworICAgICAgICBzcCA9IGMudG9fc3BsaXR0YWJsZShzKQorICAgICAgICBlcShzLCBjLmZyb21fc3BsaXR0YWJsZShzcCkpCisKKworDAorIyBUZXN0IG11bHRpbGluZ3VhbCBNSU1FIGhlYWRlcnMuCitjbGFzcyBUZXN0SGVhZGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCdIZWxsbyBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhJykKKyAgICAgICAgaC5hcHBlbmQoJ0dvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfbmVlZHNfbm9fZGVjb2Rpbmcoc2VsZik6CisgICAgICAgIGggPSAnbm8gZGVjb2RpbmcgbmVlZGVkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZV9oZWFkZXIoaCksIFsoaCwgTm9uZSldKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcigiSSBhbSB0aGUgdmVyeSBtb2RlbCBvZiBhIG1vZGVybiBNYWpvci1HZW5lcmFsOyBJJ3ZlIGluZm9ybWF0aW9uIHZlZ2V0YWJsZSwgYW5pbWFsLCBhbmQgbWluZXJhbDsgSSBrbm93IHRoZSBraW5ncyBvZiBFbmdsYW5kLCBhbmQgSSBxdW90ZSB0aGUgZmlnaHRzIGhpc3RvcmljYWwgZnJvbSBNYXJhdGhvbiB0byBXYXRlcmxvbywgaW4gb3JkZXIgY2F0ZWdvcmljYWw7IEknbSB2ZXJ5IHdlbGwgYWNxdWFpbnRlZCwgdG9vLCB3aXRoIG1hdHRlcnMgbWF0aGVtYXRpY2FsOyBJIHVuZGVyc3RhbmQgZXF1YXRpb25zLCBib3RoIHRoZSBzaW1wbGUgYW5kIHF1YWRyYXRpY2FsOyBhYm91dCBiaW5vbWlhbCB0aGVvcmVtIEknbSB0ZWVtaW5nIHdpdGggYSBsb3QgbycgbmV3cywgd2l0aCBtYW55IGNoZWVyZnVsIGZhY3RzIGFib3V0IHRoZSBzcXVhcmUgb2YgdGhlIGh5cG90ZW51c2UuIiwKKyAgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2KQorICAgICAgICBmb3IgbCBpbiBoLmVuY29kZSgpLnNwbGl0KCdcbiAnKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4obCkgPD0gNzYpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmd1YWwoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGN6ID0gQ2hhcnNldCgiaXNvLTg4NTktMiIpCisgICAgICAgIHV0ZjggPSBDaGFyc2V0KCJ1dGYtOCIpCisgICAgICAgIGdfaGVhZCA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBjel9oZWFkID0gIkZpbmFuXHhlOG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgdGxha2VtIGplamljaCBkXHhmOXZ0aXB1Li4gIgorICAgICAgICB1dGY4X2hlYWQgPSB1Ilx1NmI2M1x1NzhiYVx1MzA2Ylx1OGEwMFx1MzA0Nlx1MzA2OFx1N2ZmYlx1OGEzM1x1MzA2Zlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMFx1OTBlOFx1MzA2Zlx1MzBjOVx1MzBhNFx1MzBjNFx1OGE5ZVx1MzA2N1x1MzA1OVx1MzA0Y1x1MzAwMVx1MzA0Mlx1MzA2OFx1MzA2Zlx1MzA2N1x1MzA1Zlx1MzA4OVx1MzA4MVx1MzA2N1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgdW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0IGdlcnNwdXQuXHUzMDBkXHUzMDY4XHU4YTAwXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIi5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgaCA9IEhlYWRlcihnX2hlYWQsIGcpCisgICAgICAgIGguYXBwZW5kKGN6X2hlYWQsIGN6KQorICAgICAgICBoLmFwcGVuZCh1dGY4X2hlYWQsIHV0ZjgpCisgICAgICAgIGVuYyA9IGguZW5jb2RlKCkKKyAgICAgICAgZXEoZW5jLCAiIiI9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmU/PQorID0/aXNvLTg4NTktMT9xP21fRm9lcmRlcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudD89CisgPT9pc28tODg1OS0xP3E/bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGlzY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk/PQorID0/aXNvLTg4NTktMT9xPz0yQ19nZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmdlbl9iZWY9RjZyZGVydD0yRV8/PQorID0/aXNvLTg4NTktMj9xP0ZpbmFuPUU4bmlfbWV0cm9wb2xlX3NlX2hyb3V0aWw/PQorID0/aXNvLTg4NTktMj9xP3lfcG9kX3RsYWtlbV9qZWppY2hfZD1GOXZ0aXB1PTJFPTJFXz89CisgPT91dGYtOD9iPzVxMmo1Nks2NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdj89CisgPT91dGYtOD9iPzQ0R1Y0NEtNNDRHbTQ0R0U0NEcrNDRHYjQ0S1Q0NENDNUxpQT89CisgPT91dGYtOD9iPzZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTT89CisgPT91dGYtOD9iPzQ0Q0I0NEdDNDRHbzQ0R3Y0NEduNDRHZjQ0S0o0NEtCNDRHbj89CisgPT91dGYtOD9iPzQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q01WMlZ1YmlCcGMzUWdaR0U9Pz0KKyA9P3V0Zi04P2I/Y3lCT2RXNXpkSFZqYXlCbmFYUWdkVzVrPz0KKyA9P3V0Zi04P2I/SUZOc2IzUmxjbTFsZVdWeVB5QktZU0VnUW1WcGFHVnlhSFZ1WkNCa1lYTWdUMlJsPz0KKyA9P3V0Zi04P2I/Y2lCa2FXVWdSbXhwY0hCbGNuZGhiR1IwPz0KKyA9P3V0Zi04P2I/SUdkbGNuTndkWFF1NDRDTjQ0R282S2lBNDRHajQ0R200NEdFNDRHKzQ0R1o0NENDPz0iIiIpCisgICAgICAgIGVxKGRlY29kZV9oZWFkZXIoZW5jKSwKKyAgICAgICAgICAgWyhnX2hlYWQsICJpc28tODg1OS0xIiksIChjel9oZWFkLCAiaXNvLTg4NTktMiIpLAorICAgICAgICAgICAgKHV0ZjhfaGVhZCwgInV0Zi04IildKQorCiAKIAwKIGRlZiBzdWl0ZSgpOgpAQCAtMTA0NCwxMyArMTU5MCwxMyBAQAogICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RNaXNjZWxsYW5lb3VzKSkKICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0SXRlcmF0b3JzKSkKICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0UGFyc2VycykpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdEJhc2U2NCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdFF1b3ByaSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdEhlYWRlcikpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdENoYXJzZXQpKQogICAgIHJldHVybiBzdWl0ZQogCiAKIAwKLWRlZiB0ZXN0X21haW4oKToKLSAgICBmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3N1aXRlCi0gICAgcnVuX3N1aXRlKHN1aXRlKCkpCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9tYWluKCkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDUxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQpAQCAtMCwwICsxLDUxIEBACisjIENvcHlyaWdodCAoQykgMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMgZm9yIChvcHRpb25hbCkgQXNpYW4gY29kZWNzCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkCisKK2Zyb20gZW1haWwuQ2hhcnNldCBpbXBvcnQgQ2hhcnNldAorZnJvbSBlbWFpbC5IZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlcgorCisKKyMgU2VlIGlmIHdlIGhhdmUgdGhlIEphcGFuZXNlIGNvZGVjcyBwYWNrYWdlIGluc3RhbGxlZAordHJ5OgorICAgIHVuaWNvZGUoJ2ZvbycsICdqYXBhbmVzZS5pc28tMjAyMi1qcCcpCitleGNlcHQgTG9va3VwRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQsICdPcHRpb25hbCBKYXBhbmVzZSBjb2RlY3Mgbm90IGluc3RhbGxlZCcKKworCisMCitjbGFzcyBUZXN0RW1haWxBc2lhbkNvZGVjcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfamFwYW5lc2VfY29kZWNzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaiA9IENoYXJzZXQoImV1Yy1qcCIpCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgaCA9IEhlYWRlcigiSGVsbG8gV29ybGQhIikKKyAgICAgICAgamhlbGxvID0gJ1x4YTVceGNmXHhhNVx4ZWRceGExXHhiY1x4YTVceGVmXHhhMVx4YmNceGE1XHhlYlx4YTVceGM5XHhhMVx4YWEnCisgICAgICAgIGdoZWxsbyA9ICdHclx4ZmNceGRmIEdvdHQhJworICAgICAgICBoLmFwcGVuZChqaGVsbG8sIGopCisgICAgICAgIGguYXBwZW5kKGdoZWxsbywgZykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISA9P2lzby0yMDIyLWpwP2I/R3lSQ0pVOGxiU0U4Slc4aFBDVnJKVWtoS2hzb1FnPT0/PVxuID0/aXNvLTg4NTktMT9xP0dyPUZDPURGX0dvdHQhPz0nKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGguZW5jb2RlKCkpLAorICAgICAgICAgICBbKCdIZWxsbyBXb3JsZCEnLCBOb25lKSwKKyAgICAgICAgICAgICgnXHgxYiRCJU8lbSE8JW8hPCVrJUkhKlx4MWIoQicsICdpc28tMjAyMi1qcCcpLAorICAgICAgICAgICAgKCdHclx4ZmNceGRmIEdvdHQhJywgJ2lzby04ODU5LTEnKV0pCisgICAgICAgIGxvbmcgPSAndGVzdC1qYSBceGE0XHhkOFx4YzVceGVhXHhiOVx4YzZceGE0XHhiNVx4YTRceGVjXHhhNFx4YmZceGE1XHhlMVx4YTFceGJjXHhhNVx4ZWJceGE0XHhjZlx4YmJceGNhXHhiMlx4ZjFceGJjXHhkNFx4YTRceGNlXHhiZVx4YjVceGM3XHhhN1x4YTRceGYyXHhjMlx4ZDRceGE0XHhjM1x4YTRceGM2XHhhNFx4YTRceGE0XHhkZVx4YTRceGI5JworICAgICAgICBoID0gSGVhZGVyKGxvbmcsIGosIGhlYWRlcl9uYW1lPSJTdWJqZWN0IikKKyAgICAgICAgIyB0ZXN0IGEgdmVyeSBsb25nIGhlYWRlcgorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKGVuYywgJz0/aXNvLTIwMjItanA/Yj9kR1Z6ZEMxcVlTQWJKRUlrV0VWcU9VWWtOU1JzSkQ4bFlSc29RZz09Pz1cbiA9P2lzby0yMDIyLWpwP2I/R3lSQ0lUd2xheVJQTzBveWNUeFVKRTQrTlJzb1FnPT0/PVxuID0/aXNvLTIwMjItanA/Yj9HeVJDUnlja2NrSlVKRU1rUmlRa0pGNGtPUnNvUWc9PT89JykKKyAgICAgICAgZXEoZGVjb2RlX2hlYWRlcihlbmMpLCBbKCJ0ZXN0LWphIFx4MWIkQiRYRWo5RiQ1JGwkPyVhXHgxYihCXHgxYiRCITwlayRPO0oycTxUJE4+NVx4MWIoQlx4MWIkQkcnJHJCVCRDJEYkJCReJDlceDFiKEIiLCAnaXNvLTIwMjItanAnKV0pCisKKworDAorZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RFbWFpbEFzaWFuQ29kZWNzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCisMCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykK