typings on ai...
arsen@cntrl.site
X
PGNhbnZhcyBpZD0iZ2FtZUNhbnZhcyI+PC9jYW52YXM+CjxzY3JpcHQ+CiAgICBjbGFzcyBCaXRGaWVsZCB7CiAgICAgICAgY29uc3RydWN0b3IobGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICB0aGlzLmZpZWxkID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGxlbmd0aCAvIDgpKTsKICAgICAgICB9CgogICAgICAgIGdldCBzaXplKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGg7CiAgICAgICAgfQoKICAgICAgICBnZXQoaW5kZXgpIHsKICAgICAgICAgICAgaWYgKGluZGV4ID49IHRoaXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGNvbnN0IGlCeXRlID0gaW5kZXggPj4gMzsKICAgICAgICAgICAgY29uc3QgaUJpdCA9IGluZGV4ICUgODsKICAgICAgICAgICAgY29uc3QgYnl0ZSA9IHRoaXMuZmllbGRbaUJ5dGVdOwogICAgICAgICAgICByZXR1cm4gKGJ5dGUgJiAoMSA8PCBpQml0KSkgIT09IDA7CiAgICAgICAgfQoKICAgICAgICBzZXQoaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChpbmRleCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBpQnl0ZSA9IGluZGV4ID4+IDM7CiAgICAgICAgICAgIGNvbnN0IGlCaXQgPSBpbmRleCAlIDg7CiAgICAgICAgICAgIGNvbnN0IGJ5dGUgPSB0aGlzLmZpZWxkW2lCeXRlXTsKICAgICAgICAgICAgdGhpcy5maWVsZFtpQnl0ZV0gPSAoCiAgICAgICAgICAgICAgICB2YWx1ZQogICAgICAgICAgICAgICAgICAgID8gKGJ5dGUgfCAoMSA8PCBpQml0KSkKICAgICAgICAgICAgICAgICAgICA6IChieXRlICYgKCh+KDEgPDwgaUJpdCkpICYgMHhmZikpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IG5laWdoYm91cnMgPSBbCiAgICAgICAgWy0xLCAtMV0sIFswLCAtMV0sIFsxLCAtMV0sCiAgICAgICAgWy0xLCAwXSwgICAgICAgICAgWzEsIDBdLAogICAgICAgIFstMSwgMV0sICBbMCwgMV0sICBbMSwgMV0KICAgIF07CgogICAgY2xhc3MgQ2VsbEZpZWxkIHsKICAgICAgICBjb25zdHJ1Y3Rvcih3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBuZXcgQml0RmllbGQod2lkdGggKiBoZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgc2V0Q2VsbEF0KHgsIHksIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuY2VsbHMuc2V0KHRoaXMuZ2V0SW5kZXgoeCwgeSksIHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGdldENlbGxBdCh4LCB5KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxzLmdldCh0aGlzLmdldEluZGV4KHgsIHkpKTsKICAgICAgICB9CgogICAgICAgIGdldEFsaXZlTmVpZ2hib3Vycyh4LCB5KSB7CiAgICAgICAgICAgIHJldHVybiBuZWlnaGJvdXJzLnJlZHVjZSgoYWxpdmUsIFtkeCwgZHldKSA9PgogICAgICAgICAgICAgICAgYWxpdmUgKyAodGhpcy5nZXRDZWxsQXQoeCArIGR4LCB5ICsgZHkpID8gMSA6IDApLCAwKTsKICAgICAgICB9CgogICAgICAgIG5leHRHZW4oKSB7CiAgICAgICAgICAgIGNvbnN0IG5leHRDZWxscyA9IG5ldyBCaXRGaWVsZCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQpOwogICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5ICs9IDEpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dENlbGxzLnNldCh0aGlzLmdldEluZGV4KHgsIHkpLCB0aGlzLmRvZXNDZWxsU3Vydml2ZSh4LCB5KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jZWxscyA9IG5leHRDZWxsczsKICAgICAgICB9CgogICAgICAgIGRvZXNDZWxsU3Vydml2ZSh4LCB5KSB7CiAgICAgICAgICAgIGNvbnN0IGlzQWxpdmUgPSB0aGlzLmdldENlbGxBdCh4LCB5KTsKICAgICAgICAgICAgY29uc3QgYW4gPSB0aGlzLmdldEFsaXZlTmVpZ2hib3Vycyh4LCB5KTsKICAgICAgICAgICAgaWYgKGlzQWxpdmUpIHsKICAgICAgICAgICAgICAgIGlmIChhbiA8IDIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChhbiA8PSAzKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYW4gPT09IDM7CiAgICAgICAgfQoKICAgICAgICBnZXRJbmRleCh4LCB5KSB7CiAgICAgICAgICAgIGNvbnN0IHgxID0gKHggKyB0aGlzLndpZHRoKSAlIHRoaXMud2lkdGg7CiAgICAgICAgICAgIGNvbnN0IHkxID0gKHkgKyB0aGlzLmhlaWdodCkgJSB0aGlzLmhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIHkxICogdGhpcy53aWR0aCArIHgxOwogICAgICAgIH0KICAgIH0KCiAgICBjb25zdCBTID0gNjsgICAvLyBDZWxsIHNpemUKICAgIGNvbnN0IENXID0gNjAwOyAvLyBXaWR0aCBpbiBjZWxscwogICAgY29uc3QgQ0ggPSAyODA7IC8vIEhlaWdodCBpbiBjZWxscwogICAgY29uc3QgbGRjZWxscyA9IFsKICAgICAgICBbMCwgMF0sCiAgICAgICAgWzEsIDBdLAogICAgICAgIFswLCAxXSwKICAgICAgICBbMSwgMV0KICAgIF07CgogICAgZnVuY3Rpb24gZHJhd0dlbihjdHgsIGNlbGxzLCBjZWxsU2l6ZSkgewogICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgY2VsbHMuaGVpZ2h0OyB5ICs9IDEpIHsKICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjZWxscy53aWR0aDsgeCArPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNlbGxzLmdldENlbGxBdCh4LCB5KSkgY29udGludWU7CiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoeCAqIGNlbGxTaXplLCB5ICogY2VsbFNpemUsIGNlbGxTaXplIC0gMSwgY2VsbFNpemUgLSAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkcmF3TG9nbyhjZWxscywgeCwgeSwgbGVuKSB7CiAgICAgICAgY29uc3QgbGluZXMgPSBsb2dvU3RyLnNwbGl0KCdcbicpLnNsaWNlKDEsIC0xKTsKICAgICAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgbGluZXMubGVuZ3RoOyBpeSArPSAxKSB7CiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpeV07CiAgICAgICAgICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBsaW5lLmxlbmd0aDsgaXggKz0gMSkgewogICAgICAgICAgICAgICAgY29uc3QgZHJhdyA9IGxpbmVbaXhdID09PSAnKic7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtkeCwgZHldIG9mIGxkY2VsbHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjeCA9IHggKyBpeCAqIDIgKyBkeDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjeSA9IHkgKyBpeSAqIDIgKyBkeTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRyYXcgPyAoY2VsbHMuZ2V0Q2VsbEF0KGN4LCBjeSkgfHwgKE1hdGgucmFuZG9tKCkgPCBsZW4pKSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGNlbGxzLnNldENlbGxBdChjeCwgY3ksIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVBbmltYXRpb24ocGFyYW1zKSB7CiAgICAgICAgY29uc3QgeyBjYW52YXMsIHdpZHRoLCBoZWlnaHQsIGNlbGxTaXplLCBnZW5lcmF0aW9uVGltZW91dCwgbG9nb1RpbWVvdXQsIGNvbG9yIH0gPSBwYXJhbXM7CiAgICAgICAgY29uc3QgY2VsbHMgPSBuZXcgQ2VsbEZpZWxkKHdpZHRoLCBoZWlnaHQpOwogICAgICAgIGNvbnN0IHZwQ3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgY29uc3QgYnVmZmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgY29uc3QgYmZDdHggPSBidWZmZXIuZ2V0Q29udGV4dCgnMmQnKTsKCiAgICAgICAgbGV0IGxhc3RHZW4gPSBEYXRlLm5vdygpOwogICAgICAgIGxldCBsYXN0TG9nbyA9IERhdGUubm93KCkgLSBsb2dvVGltZW91dDsKICAgICAgICBsZXQgaXNMb2dvVmlzaWJsZSA9IGZhbHNlOwoKICAgICAgICBidWZmZXIud2lkdGggPSB3aWR0aCAqIGNlbGxTaXplOwogICAgICAgIGJ1ZmZlci5oZWlnaHQgPSBoZWlnaHQgKiBjZWxsU2l6ZTsKICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGNlbGxTaXplOwogICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBjZWxsU2l6ZTsKCiAgICAgICAgLy8gQWRqdXN0ZWQgbW91c2UgcG9zaXRpb24gaGFuZGxpbmcgdG8gY29uc2lkZXIgc2NhbGluZwogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHsKICAgICAgICAgICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgY29uc3Qgc2NhbGVYID0gY2FudmFzLndpZHRoIC8gcmVjdC53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc2NhbGVZID0gY2FudmFzLmhlaWdodCAvIHJlY3QuaGVpZ2h0OwogICAgICAgICAgICBjb25zdCB4ID0gTWF0aC5mbG9vcigoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgKiBzY2FsZVggLyBjZWxsU2l6ZSk7CiAgICAgICAgICAgIGNvbnN0IHkgPSBNYXRoLmZsb29yKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApICogc2NhbGVZIC8gY2VsbFNpemUpOwogICAgICAgICAgICBjZWxscy5zZXRDZWxsQXQoeCwgeSwgdHJ1ZSk7IC8vIE1hcmsgdGhlIGNlbGwgYXMgYWxpdmUKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gbG9vcCgpIHsKICAgICAgICAgICAgaWYgKCFiZkN0eCB8fCAhdnBDdHgpIHJldHVybjsKICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgZ2VuRHQgPSBub3cgLSBsYXN0R2VuOwogICAgICAgICAgICBjb25zdCBsb2dvRHQgPSBub3cgLSBsYXN0TG9nbzsKCiAgICAgICAgICAgIGlmIChnZW5EdCA+IGdlbmVyYXRpb25UaW1lb3V0KSB7CiAgICAgICAgICAgICAgICBsYXN0R2VuID0gbm93OwogICAgICAgICAgICAgICAgY2VsbHMubmV4dEdlbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb2dvRHQgPiBsb2dvVGltZW91dCkgewogICAgICAgICAgICAgICAgbGFzdExvZ28gPSBub3c7CiAgICAgICAgICAgICAgICBpc0xvZ29WaXNpYmxlID0gIWlzTG9nb1Zpc2libGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJmQ3R4LmNsZWFyUmVjdCgwLCAwLCBidWZmZXIud2lkdGgsIGJ1ZmZlci5oZWlnaHQpOwogICAgICAgICAgICBiZkN0eC5maWxsU3R5bGUgPSBjb2xvcjsKICAgICAgICAgICAgZHJhd0dlbihiZkN0eCwgY2VsbHMsIGNlbGxTaXplKTsKICAgICAgICAgICAgdnBDdHgucHV0SW1hZ2VEYXRhKGJmQ3R4LmdldEltYWdlRGF0YSgwLCAwLCBidWZmZXIud2lkdGgsIGJ1ZmZlci5oZWlnaHQpLCAwLCAwKTsKICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApOwogICAgICAgIH0KCiAgICAgICAgbG9vcCgpOwogICAgfQoKICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnYW1lQ2FudmFzJyk7CiAgICBjb25zdCBjb2xvciA9ICd3aGl0ZSc7ICAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgY2VsbCBjb2xvciBoZXJlCiAgICBjcmVhdGVBbmltYXRpb24oewogICAgICAgIGNhbnZhczogY2FudmFzLAogICAgICAgIHdpZHRoOiBDVywKICAgICAgICBoZWlnaHQ6IENILAogICAgICAgIGNlbGxTaXplOiBTLAogICAgICAgIGdlbmVyYXRpb25UaW1lb3V0OiAzMDAsCiAgICAgICAgbG9nb1RpbWVvdXQ6IDQwNTAsCiAgICAgICAgY29sb3I6IGNvbG9yCiAgICB9KTsKPC9zY3JpcHQ+
Github
Building A Web Design Tool
Control
Building A Web Design Tool
Control
Crafting sites and apps at
MOM DESIGN
Crafting sites and apps at
MOM DESIGN
Software Developer
Vienna, Austria
PGNhbnZhcyBpZD0iZ2FtZUNhbnZhcyI+PC9jYW52YXM+CjxzY3JpcHQ+CiAgICBjbGFzcyBCaXRGaWVsZCB7CiAgICAgICAgY29uc3RydWN0b3IobGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICB0aGlzLmZpZWxkID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGxlbmd0aCAvIDgpKTsKICAgICAgICB9CgogICAgICAgIGdldCBzaXplKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGg7CiAgICAgICAgfQoKICAgICAgICBnZXQoaW5kZXgpIHsKICAgICAgICAgICAgaWYgKGluZGV4ID49IHRoaXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGNvbnN0IGlCeXRlID0gaW5kZXggPj4gMzsKICAgICAgICAgICAgY29uc3QgaUJpdCA9IGluZGV4ICUgODsKICAgICAgICAgICAgY29uc3QgYnl0ZSA9IHRoaXMuZmllbGRbaUJ5dGVdOwogICAgICAgICAgICByZXR1cm4gKGJ5dGUgJiAoMSA8PCBpQml0KSkgIT09IDA7CiAgICAgICAgfQoKICAgICAgICBzZXQoaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChpbmRleCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBpQnl0ZSA9IGluZGV4ID4+IDM7CiAgICAgICAgICAgIGNvbnN0IGlCaXQgPSBpbmRleCAlIDg7CiAgICAgICAgICAgIGNvbnN0IGJ5dGUgPSB0aGlzLmZpZWxkW2lCeXRlXTsKICAgICAgICAgICAgdGhpcy5maWVsZFtpQnl0ZV0gPSAoCiAgICAgICAgICAgICAgICB2YWx1ZQogICAgICAgICAgICAgICAgICAgID8gKGJ5dGUgfCAoMSA8PCBpQml0KSkKICAgICAgICAgICAgICAgICAgICA6IChieXRlICYgKCh+KDEgPDwgaUJpdCkpICYgMHhmZikpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IG5laWdoYm91cnMgPSBbCiAgICAgICAgWy0xLCAtMV0sIFswLCAtMV0sIFsxLCAtMV0sCiAgICAgICAgWy0xLCAwXSwgICAgICAgICAgWzEsIDBdLAogICAgICAgIFstMSwgMV0sICBbMCwgMV0sICBbMSwgMV0KICAgIF07CgogICAgY2xhc3MgQ2VsbEZpZWxkIHsKICAgICAgICBjb25zdHJ1Y3Rvcih3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgICAgICAgIHRoaXMuY2VsbHMgPSBuZXcgQml0RmllbGQod2lkdGggKiBoZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgc2V0Q2VsbEF0KHgsIHksIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuY2VsbHMuc2V0KHRoaXMuZ2V0SW5kZXgoeCwgeSksIHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGdldENlbGxBdCh4LCB5KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxzLmdldCh0aGlzLmdldEluZGV4KHgsIHkpKTsKICAgICAgICB9CgogICAgICAgIGdldEFsaXZlTmVpZ2hib3Vycyh4LCB5KSB7CiAgICAgICAgICAgIHJldHVybiBuZWlnaGJvdXJzLnJlZHVjZSgoYWxpdmUsIFtkeCwgZHldKSA9PgogICAgICAgICAgICAgICAgYWxpdmUgKyAodGhpcy5nZXRDZWxsQXQoeCArIGR4LCB5ICsgZHkpID8gMSA6IDApLCAwKTsKICAgICAgICB9CgogICAgICAgIG5leHRHZW4oKSB7CiAgICAgICAgICAgIGNvbnN0IG5leHRDZWxscyA9IG5ldyBCaXRGaWVsZCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQpOwogICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5ICs9IDEpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dENlbGxzLnNldCh0aGlzLmdldEluZGV4KHgsIHkpLCB0aGlzLmRvZXNDZWxsU3Vydml2ZSh4LCB5KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jZWxscyA9IG5leHRDZWxsczsKICAgICAgICB9CgogICAgICAgIGRvZXNDZWxsU3Vydml2ZSh4LCB5KSB7CiAgICAgICAgICAgIGNvbnN0IGlzQWxpdmUgPSB0aGlzLmdldENlbGxBdCh4LCB5KTsKICAgICAgICAgICAgY29uc3QgYW4gPSB0aGlzLmdldEFsaXZlTmVpZ2hib3Vycyh4LCB5KTsKICAgICAgICAgICAgaWYgKGlzQWxpdmUpIHsKICAgICAgICAgICAgICAgIGlmIChhbiA8IDIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChhbiA8PSAzKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYW4gPT09IDM7CiAgICAgICAgfQoKICAgICAgICBnZXRJbmRleCh4LCB5KSB7CiAgICAgICAgICAgIGNvbnN0IHgxID0gKHggKyB0aGlzLndpZHRoKSAlIHRoaXMud2lkdGg7CiAgICAgICAgICAgIGNvbnN0IHkxID0gKHkgKyB0aGlzLmhlaWdodCkgJSB0aGlzLmhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIHkxICogdGhpcy53aWR0aCArIHgxOwogICAgICAgIH0KICAgIH0KCiAgICBjb25zdCBTID0gNjsgICAvLyBDZWxsIHNpemUKICAgIGNvbnN0IENXID0gNjAwOyAvLyBXaWR0aCBpbiBjZWxscwogICAgY29uc3QgQ0ggPSAyODA7IC8vIEhlaWdodCBpbiBjZWxscwoKICAgIGNvbnN0IGxvZ29TdHIgPSBgCioqKioqKiAgKioqKioqICAgKioqKioqICAqKioqKiogICogICAgKiAgICAqKioqKiogICAqKioqKiogICoqKioqKiAgKiAgICAqICAqICAgICAqICAgKioqKiAgICogICAgKiAgICoqKiogICAqICAqCiogICAgKiAgKiAgICAgKiAgKiAgICAgICAqICAgICAgICoqICAgKiAgICAqICAgICAqICAqICAgICogICAgKiAgICAgKiAgICAqICAqICAgICAqICAqICAgICogICogICAgKiAgKiAgICAqICAqICoKKioqKioqICAqKioqKiAgICAqKioqKiogICoqKiogICAgKiAqICAqICAgICoqKioqKiAgICoqKioqKiAgICAqICAgICAgKiAgKiAgICogICAgICogICogICAgICAgKioqKioqICAqICAgICogICoqCiogICAgKiAgKiAgICAqICAgICAgICAqICAqICAgICAgICogICogKiAgICAqICAgICAqICAqICAgICogICAgICogICAgICAqKiAgICAqICAgICAqICAqICAgICogICogICAgKiAgKiAgICAqICAqICoKKiAgICAqICAqICAgICAqICAqKioqKiogICoqKioqKiAgKiAgICoqICAgICoqKioqKiAgICogICAgKiAgICAgKiAgICAgICoqICAgICAqKioqKiAgICAqKioqICAgKiAgICAqICAgKioqKiAgICogICoKYDsKCiAgICBjb25zdCBsZGNlbGxzID0gWwogICAgICAgIFswLCAwXSwKICAgICAgICBbMSwgMF0sCiAgICAgICAgWzAsIDFdLAogICAgICAgIFsxLCAxXQogICAgXTsKCiAgICBmdW5jdGlvbiBkcmF3R2VuKGN0eCwgY2VsbHMsIGNlbGxTaXplKSB7CiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBjZWxscy5oZWlnaHQ7IHkgKz0gMSkgewogICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNlbGxzLndpZHRoOyB4ICs9IDEpIHsKICAgICAgICAgICAgICAgIGlmICghY2VsbHMuZ2V0Q2VsbEF0KHgsIHkpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCh4ICogY2VsbFNpemUsIHkgKiBjZWxsU2l6ZSwgY2VsbFNpemUgLSAxLCBjZWxsU2l6ZSAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRyYXdMb2dvKGNlbGxzLCB4LCB5LCBsZW4pIHsKICAgICAgICBjb25zdCBsaW5lcyA9IGxvZ29TdHIuc3BsaXQoJ1xuJykuc2xpY2UoMSwgLTEpOwogICAgICAgIGZvciAobGV0IGl5ID0gMDsgaXkgPCBsaW5lcy5sZW5ndGg7IGl5ICs9IDEpIHsKICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2l5XTsKICAgICAgICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGxpbmUubGVuZ3RoOyBpeCArPSAxKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkcmF3ID0gbGluZVtpeF0gPT09ICcqJzsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2R4LCBkeV0gb2YgbGRjZWxscykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGN4ID0geCArIGl4ICogMiArIGR4OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGN5ID0geSArIGl5ICogMiArIGR5OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZHJhdyA/IChjZWxscy5nZXRDZWxsQXQoY3gsIGN5KSB8fCAoTWF0aC5yYW5kb20oKSA8IGxlbikpIDogZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY2VsbHMuc2V0Q2VsbEF0KGN4LCBjeSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUFuaW1hdGlvbihwYXJhbXMpIHsKICAgICAgICBjb25zdCB7IGNhbnZhcywgd2lkdGgsIGhlaWdodCwgY2VsbFNpemUsIGdlbmVyYXRpb25UaW1lb3V0LCBsb2dvVGltZW91dCwgY29sb3IgfSA9IHBhcmFtczsKICAgICAgICBjb25zdCBjZWxscyA9IG5ldyBDZWxsRmllbGQod2lkdGgsIGhlaWdodCk7CiAgICAgICAgY29uc3QgdnBDdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICBjb25zdCBidWZmZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgICBjb25zdCBiZkN0eCA9IGJ1ZmZlci5nZXRDb250ZXh0KCcyZCcpOwoKICAgICAgICBsZXQgbGFzdEdlbiA9IERhdGUubm93KCk7CiAgICAgICAgbGV0IGxhc3RMb2dvID0gRGF0ZS5ub3coKSAtIGxvZ29UaW1lb3V0OwogICAgICAgIGxldCBpc0xvZ29WaXNpYmxlID0gZmFsc2U7CgogICAgICAgIGJ1ZmZlci53aWR0aCA9IHdpZHRoICogY2VsbFNpemU7CiAgICAgICAgYnVmZmVyLmhlaWdodCA9IGhlaWdodCAqIGNlbGxTaXplOwogICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogY2VsbFNpemU7CiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGNlbGxTaXplOwoKICAgICAgICAvLyBBZGp1c3RlZCBtb3VzZSBwb3NpdGlvbiBoYW5kbGluZyB0byBjb25zaWRlciBzY2FsaW5nCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChldmVudCkgPT4gewogICAgICAgICAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICBjb25zdCBzY2FsZVggPSBjYW52YXMud2lkdGggLyByZWN0LndpZHRoOwogICAgICAgICAgICBjb25zdCBzY2FsZVkgPSBjYW52YXMuaGVpZ2h0IC8gcmVjdC5oZWlnaHQ7CiAgICAgICAgICAgIGNvbnN0IHggPSBNYXRoLmZsb29yKChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAqIHNjYWxlWCAvIGNlbGxTaXplKTsKICAgICAgICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IoKGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCkgKiBzY2FsZVkgLyBjZWxsU2l6ZSk7CiAgICAgICAgICAgIGNlbGxzLnNldENlbGxBdCh4LCB5LCB0cnVlKTsgLy8gTWFyayB0aGUgY2VsbCBhcyBhbGl2ZQogICAgICAgIH0pOwoKICAgICAgICBmdW5jdGlvbiBsb29wKCkgewogICAgICAgICAgICBpZiAoIWJmQ3R4IHx8ICF2cEN0eCkgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBjb25zdCBnZW5EdCA9IG5vdyAtIGxhc3RHZW47CiAgICAgICAgICAgIGNvbnN0IGxvZ29EdCA9IG5vdyAtIGxhc3RMb2dvOwoKICAgICAgICAgICAgaWYgKGdlbkR0ID4gZ2VuZXJhdGlvblRpbWVvdXQpIHsKICAgICAgICAgICAgICAgIGxhc3RHZW4gPSBub3c7CiAgICAgICAgICAgICAgICBjZWxscy5uZXh0R2VuKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvZ29EdCA+IGxvZ29UaW1lb3V0KSB7CiAgICAgICAgICAgICAgICBsYXN0TG9nbyA9IG5vdzsKICAgICAgICAgICAgICAgIGlzTG9nb1Zpc2libGUgPSAhaXNMb2dvVmlzaWJsZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xvZ29WaXNpYmxlKSB7CiAgICAgICAgICAgICAgICBkcmF3TG9nbyhjZWxscywgMTAwLCAxMiwgTWF0aC5taW4oKGxvZ29EdCAqIDEuNSkgLyBsb2dvVGltZW91dCwgMSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBiZkN0eC5jbGVhclJlY3QoMCwgMCwgYnVmZmVyLndpZHRoLCBidWZmZXIuaGVpZ2h0KTsKICAgICAgICAgICAgYmZDdHguZmlsbFN0eWxlID0gY29sb3I7CiAgICAgICAgICAgIGRyYXdHZW4oYmZDdHgsIGNlbGxzLCBjZWxsU2l6ZSk7CiAgICAgICAgICAgIHZwQ3R4LnB1dEltYWdlRGF0YShiZkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYnVmZmVyLndpZHRoLCBidWZmZXIuaGVpZ2h0KSwgMCwgMCk7CiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsKICAgICAgICB9CgogICAgICAgIGxvb3AoKTsKICAgIH0KCiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2FtZUNhbnZhcycpOwogICAgY29uc3QgY29sb3IgPSAnd2hpdGUnOyAgLy8gWW91IGNhbiBjaGFuZ2UgdGhlIGNlbGwgY29sb3IgaGVyZQogICAgY3JlYXRlQW5pbWF0aW9uKHsKICAgICAgICBjYW52YXM6IGNhbnZhcywKICAgICAgICB3aWR0aDogQ1csCiAgICAgICAgaGVpZ2h0OiBDSCwKICAgICAgICBjZWxsU2l6ZTogUywKICAgICAgICBnZW5lcmF0aW9uVGltZW91dDogMzAwLAogICAgICAgIGxvZ29UaW1lb3V0OiA0MDUwLAogICAgICAgIGNvbG9yOiBjb2xvcgogICAgfSk7Cjwvc2NyaXB0Pg==