LyoKICogIFRFU1QgU1VJVEUgRk9SIE1CL1dDIEZVTkNUSU9OUyBJTiBDIExJQlJBUlkKICoKICoJIEZJTEU6CWRhdF93Y3NydG9tYnMuYwogKgogKgkgV0NTVE9NQlM6ICBzaXplX3Qgd2NzcnRvbWJzIChjaGFyICpzLCBjb25zdCB3Y2hhcl90ICoqd3MsCiAqCQkJCSAgICAgIHNpemVfdCBuLCBtYnN0YXRlICpwcykKICovCgoKLyoKICogIENBVVRJT046CiAqCSAgICAgRG8gbm90IHVzZSBhIHZhbHVlIDB4MDEgZm9yIHN0cmluZyBkYXRhLiBUaGUgdGVzdCBwcm9ncmFtCiAqCSAgICAgdXNlcyBpdC4KICoKICovCgoKVFNUX1dDU1JUT01CUyB0c3Rfd2NzcnRvbWJzX2xvYyBbXSA9IHsKICB7CiAgICB7IFR3Y3NydG9tYnMsIFRTVF9MT0NfZGUgfSwKICAgIHsKICAgICAgLyogIzAxIDogQW55IGNoYXJzIGluY2x1ZGluZyBhIG51bGwgY2hhciBzaG91bGQgbm90IGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MDBDNCwweDAwRDYsMHgwMERDLDB4MDAwMCB9LCAwLCAwLCAwfSwKCS8qZXhwZWN0Ki8geyAwLDEsMCwJICIiCQkJCQl9LAogICAgICB9LAogICAgICAvKiAjMDIgOiBPbmx5IG9uZSBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuIE5vIG51bGwgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgwMEM0LDB4MDBENiwweDAwREMsMHgwMDAwIH0sIDEsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMSwJICLEIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwMyA6IE9ubHkgdHdvIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gTm8gbnVsbCB0ZXJtaW5hdGlvbi4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDAwQzQsMHgwMEQ2LDB4MDBEQywweDAwMDAgfSwgMiwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwyLAkgIsTWIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNCA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsCgkgICAgICAgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgwMEM0LDB4MDBENiwweDAwREMsMHgwMDAwIH0sIDMsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICLE1twiCQkJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzA1IDogT25seSB0aHJlZSBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMgd2l0aCBhIG51bGwKCSAgICAgICB0ZXJtaW5hdGlvbi4gKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MDBDNCwweDAwRDYsMHgwMERDLDB4MDAwMCB9LCA0LCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDMsCSAixNbcIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNiA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzIHdpdGggYSBudWxsCgkgICAgICAgdGVybWluYXRpb24uICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDAwQzQsMHgwMEQ2LDB4MDBEQywweDAwMDAgfSwgNSwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIsTW3CIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMDcgOiBJbnZhbGlkIG1iIHNlcXVlbmNlLiBObyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sIDIsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwoc2l6ZV90KS0xLAkgIiIJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzA4IDogcyBpcyBhIG51bGwgcG9pbnRlciwgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAl7IDB4MDBDNCwweDAwRDYsMHgwMERDLDB4MDAwMCB9LCAwLCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDMsCSAiIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwOSA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJeyAweDAwQzQsMHgwMEQ2LDB4MDBEQywweDAwMDAgfSwgMSwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIiIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMTAgOiBzIGlzIGEgbnVsbCBwb2ludGVyLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCXsgMHgwMEM0LDB4MDBENiwweDAwREMsMHgwMDAwIH0sIDUsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICIiCQkJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzExIDogcyBpcyBhIG51bGwgcG9pbnRlci4gTm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAl7IDB4MDIwMSwweDAyMjEsMHgwMDAwLDB4MDAwMCB9LCA1LCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgRUlMU0VRLDEsKHNpemVfdCktMSwJICIiCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMiA6IHdzIGlzIGEgbnVsbCB3YyBzdHJpbmcsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDAwMDAgfSwJCQkgNSwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwwLAkgIiIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMTMgOiBzIGlzIGEgbnVsbCBwb2ludGVyLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCXsgMHgwMDAwIH0sCQkJIDUsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMCwJICIiCQkJCQkgfSwKICAgICAgfSwKICAgICAgeyAuaXNfbGFzdCA9IDEgfQogICAgfQogIH0sCiAgewogICAgeyBUd2NzcnRvbWJzLCBUU1RfTE9DX2VuVVMgfSwKICAgIHsKICAgICAgLyogIzAxIDogQW55IGNoYXJzIGluY2x1ZGluZyBhIG51bGwgY2hhciBzaG91bGQgbm90IGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MDA0MSwweDAwNDIsMHgwMDQzLDB4MDAwMCB9LCAwLCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwMiA6IE9ubHkgb25lIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gTm8gbnVsbCB0ZXJtaW5hdGlvbi4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDAwNDEsMHgwMDQyLDB4MDA0MywweDAwMDAgfSwgMSwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwxLAkgIkEiCQkJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzAzIDogT25seSB0d28gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsIHRlcm1pbmF0aW9uLiAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgwMDQxLDB4MDA0MiwweDAwNDMsMHgwMDAwIH0sIDIsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMiwJICJBQiIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMDQgOiBPbmx5IHRocmVlIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gTm8gbnVsbAoJICAgICAgIHRlcm1pbmF0aW9uLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MDA0MSwweDAwNDIsMHgwMDQzLDB4MDAwMCB9LCAzLCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDMsCSAiQUJDIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNSA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzIHdpdGggYSBudWxsCgkgICAgICAgdGVybWluYXRpb24uICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDAwNDEsMHgwMDQyLDB4MDA0MywweDAwMDAgfSwgNCwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIkFCQyIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMDYgOiBPbmx5IHRocmVlIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcyB3aXRoIGEgbnVsbAoJICAgICAgIHRlcm1pbmF0aW9uLiAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgwMDQxLDB4MDA0MiwweDAwNDMsMHgwMDAwIH0sIDUsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICJBQkMiCQkJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzA3IDogSW52YWxpZCBtYiBzZXF1ZW5jZS4gTm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MDIwMSwweDAyMjEsMHgwMDAwLDB4MDAwMCB9LCAyLCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgRUlMU0VRLDEsKHNpemVfdCktMSwJICIiCQkJCQl9LAogICAgICB9LAogICAgICAvKiAjMDggOiBzIGlzIGEgbnVsbCBwb2ludGVyLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCXsgMHgwMDQxLDB4MDA0MiwweDAwNDMsMHgwMDAwIH0sIDAsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywJICIiCQkJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzA5IDogcyBpcyBhIG51bGwgcG9pbnRlciwgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAl7IDB4MDA0MSwweDAwNDIsMHgwMDQzLDB4MDAwMCB9LCAxLCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDMsCSAiIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMCA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJeyAweDAwNDEsMHgwMDQyLDB4MDA0MywweDAwMDAgfSwgNSwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwzLAkgIiIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMTEgOiBzIGlzIGEgbnVsbCBwb2ludGVyLiBObyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCXsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sIDUsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwoc2l6ZV90KS0xLAkgIiIJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzEyIDogd3MgaXMgYSBudWxsIHdjIHN0cmluZywgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MDAwMCB9LAkJCSA1LCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMyA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJeyAweDAwMDAgfSwJCQkgNSwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwwLAkgIiIJCQkJCSB9LAogICAgICB9LAogICAgICB7IC5pc19sYXN0ID0gMSB9CiAgICB9CiAgfSwKICB7CiAgICB7IFR3Y3NydG9tYnMsIFRTVF9MT0NfZXVjSlAgfSwKICAgIHsKCiAgICAgIC8qICMwMSA6IEFueSBjaGFycyBpbmNsdWRpbmcgYSBudWxsIGNoYXIgc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDMwNDIsMHgzMDQ0LDB4RkY3MywweDAwMDAgfSwgMCwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwwLAkgIiIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMDIgOiBPbmx5IG9uZSBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuIE5vIG51bGwgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgzMDQyLDB4MzA0NCwweEZGNzMsMHgwMDAwIH0sIDIsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMiwJICAgICJcMjQ0XDI0MiIJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwMyA6IE9ubHkgdHdvIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gTm8gbnVsbCB0ZXJtaW5hdGlvbi4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDMwNDIsMHgzMDQ0LDB4RkY3MywweDAwMDAgfSwgNCwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSw0LAkgICAgIlwyNDRcMjQyXDI0NFwyNDQiCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNCA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiBObyBudWxsCgkgICAgICAgdGVybWluYXRpb24uICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgzMDQyLDB4MzA0NCwweEZGNzMsMHgwMDAwIH0sIDYsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsNiwJICAgICJcMjQ0XDI0MlwyNDRcMjQ0XDIxNlwyNjMiCQkgfSwKICAgICAgfSwKICAgICAgLyogIzA1IDogT25seSB0aHJlZSBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMgd2l0aCBhIG51bGwKCSAgICAgICB0ZXJtaW5hdGlvbi4gKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MzA0MiwweDMwNDQsMHhGRjczLDB4MDAwMCB9LCA3LCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDYsCSAgICAiXDI0NFwyNDJcMjQ0XDI0NFwyMTZcMjYzIgkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMwNiA6IE9ubHkgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzIHdpdGggYSBudWxsCgkgICAgICAgdGVybWluYXRpb24uICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsMSwJeyAweDMwNDIsMHgzMDQ0LDB4RkY3MywweDAwMDAgfSwgOCwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSw2LAkgICAgIlwyNDRcMjQyXDI0NFwyNDRcMjE2XDI2MyIJCSB9LAogICAgICB9LAogICAgICAvKiAjMDcgOiBJbnZhbGlkIG1iIHNlcXVlbmNlLiBObyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLDEsCXsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sIDIsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwtMSwgIiIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMDggOiBzIGlzIGEgbnVsbCBwb2ludGVyLCBubyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCXsgMHgzMDQyLDB4MzA0NCwweEZGNzMsMHgwMDAwIH0sIDAsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsNiwJICIiCQkJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzA5IDogcyBpcyBhIG51bGwgcG9pbnRlciwgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMCwxLAl7IDB4MzA0MiwweDMwNDQsMHhGRjczLDB4MDAwMCB9LCAxLCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDYsCSAiIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMCA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJeyAweDMwNDIsMHgzMDQ0LDB4RkY3MywweDAwMDAgfSwgOCwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSw2LAkgIiIJCQkJCSB9LAogICAgICB9LAogICAgICAvKiAjMTEgOiBzIGlzIGEgbnVsbCBwb2ludGVyLiBObyBjaGFycyBzaG91bGQgYmUgc3RvcmVkIGluIHMuICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLDEsCXsgMHgwMjAxLDB4MDIyMSwweDAwMDAsMHgwMDAwIH0sIDUsIDAsIDAgfSwKCS8qZXhwZWN0Ki8geyBFSUxTRVEsMSwoc2l6ZV90KS0xLAkgIiIJCQkgfSwKICAgICAgfSwKICAgICAgLyogIzEyIDogd3MgaXMgYSBudWxsIHdjIHN0cmluZywgbm8gY2hhcnMgc2hvdWxkIGJlIHN0b3JlZCBpbiBzLiAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwxLAl7IDB4MDAwMCB9LAkJCSA1LCAwLCAwIH0sCgkvKmV4cGVjdCovIHsgMCwxLDAsCSAiIgkJCQkJIH0sCiAgICAgIH0sCiAgICAgIC8qICMxMyA6IHMgaXMgYSBudWxsIHBvaW50ZXIsIG5vIGNoYXJzIHNob3VsZCBiZSBzdG9yZWQgaW4gcy4gICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDAsMSwJeyAweDAwMDAgfSwJCQkgNSwgMCwgMCB9LAoJLypleHBlY3QqLyB7IDAsMSwwLAkgIiIJCQkJCSB9LAogICAgICB9LAogICAgICB7IC5pc19sYXN0ID0gMSB9CiAgICB9CiAgfSwKICB7CiAgICB7IFR3Y3NydG9tYnMsIFRTVF9MT0NfZW5kIH0KICB9Cn07Cg==