LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIG1vcnBob19oZHJfY2hlY2tlci5oDQogKiBbQ1A5MzIvQ1JMRl0geyCCoCCVhI2GibuV+46ujqmTrpS7kuiXcCB9DQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgTW9ycGhvLEluYy4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWZuZGVmIE1PUlBIT19IRFJfQ0hFQ0tFUl9IDQojZGVmaW5lIE1PUlBIT19IRFJfQ0hFQ0tFUl9IDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAibW9ycGhvX2FwaS5oIg0KI2luY2x1ZGUgIm1vcnBob19lcnJvci5oIg0KI2luY2x1ZGUgIm1vcnBob19pbWFnZV9kYXRhLmgiDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojZGVmaW5lIE1PUlBIT19IRFJfQ0hFQ0tFUl9WRVIgIk1vcnBobyBEUiBDaGVja2VyIFZlci4xLjEuMCAyMDEyLzEvMTciDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojZGVmaW5lIE1PUlBIT19IRFJfQ0hFQ0tFUl9NSU5fSU1BR0VfV0lEVEggICAgIDINCiNkZWZpbmUgTU9SUEhPX0hEUl9DSEVDS0VSX01BWF9JTUFHRV9XSURUSCAgODE5Mg0KI2RlZmluZSBNT1JQSE9fSERSX0NIRUNLRVJfTUlOX0lNQUdFX0hFSUdIVCAgICAyDQojZGVmaW5lIE1PUlBIT19IRFJfQ0hFQ0tFUl9NQVhfSU1BR0VfSEVJR0hUIDgxOTINCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCnR5cGVkZWYgc3RydWN0IF9tb3JwaG9fSERSQ2hlY2tlciBtb3JwaG9fSERSQ2hlY2tlcjsNCg0KLyogSERSjneVV5Vdib+K7SAqLw0Kc3RydWN0IF9tb3JwaG9fSERSQ2hlY2tlcg0Kew0KICAgIHZvaWQgKnA7IC8qKjwgk+CVlI1ckaKRzILWgsyDfINDg5ODXiAqLw0KfTsNCg0KLyoglJKU8oLRgUWNlYLCgtSC6pS7kuiCzJVxirSTeCAqLw0KdHlwZWRlZiBlbnVtIHsNCiAgICBNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJVFlfU0VOU0lUSVZFLA0KICAgIE1PUlBIT19IRFJfQ0hFQ0tFUl9TRU5TSVRJVklUWV9OT1JNQUwsDQogICAgTU9SUEhPX0hEUl9DSEVDS0VSX1NFTlNJVElWSVRZX0lOU0VOU0lUSVZFLA0KfSBNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJVFk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWZkZWYgX19jcGx1c3BsdXMNCmV4dGVybiAiQyIgew0KI2VuZGlmDQoNCi8qKg0KICogg2+BW4NXg4eDk5W2jpqX8YLwjuaTvg0KICoNCiAqIEByZXR1cm4gg2+BW4NXg4eDk5W2jpqX8ShNT1JQSE9fRUFTWV9IRFJfVkVSKQ0KICovDQpNT1JQSE9fQVBJKGNvbnN0IGNoYXIqKQ0KbW9ycGhvX0hEUkNoZWNrZXJfZ2V0VmVyc2lvbih2b2lkKTsNCg0KLyoqDQogKiCVS5d2gsiDgYOCg4qDVINDg1mC8I7mk74NCiAqDQogKiBAcGFyYW1baW5dIHdpZHRoICCT/JfNieaRnILMlZ0NCiAqIEBwYXJhbVtpbl0gaGVpZ2h0IJP8l82J5pGcgsyNgoKzDQogKiBAcGFyYW1baW5dIGZvcm1hdCCT/JfNieaRnILMg3SDSIFbg32DYoNnDQogKiBAcmV0dXJuIJVLl3aCyIOBg4KDioNUg0ODWShieXRlKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19IRFJDaGVja2VyX2dldEJ1ZmZlclNpemUoDQogICAgaW50IHdpZHRoLA0KICAgIGludCBoZWlnaHQsDQogICAgY29uc3QgY2hhciAqZm9ybWF0KTsNCg0KLyoqDQogKiCPiYr6ibsNCiAqDQogKiBAcGFyYW1baW4sb3V0XSBwICAgICAgICAgICBIRFJDaGVja2Vyg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1baW5dICAgICBidWZmZXIgICAgICBIRFJDaGVja2VygsmKhILok5aCxILpg4GDgoOKgtaCzIN8g0ODk4NeDQogKiBAcGFyYW1baW5dICAgICBidWZmZXJfc2l6ZSBIRFJDaGVja2VygsmKhILok5aCxILpg4GDgoOKgsyDVINDg1kNCiAqIEBwYXJhbVtpbl0gICAgIHdpZHRoICAgICAgIJP8l82J5pGcgsyVnQ0KICogQHBhcmFtW2luXSAgICAgaGVpZ2h0ICAgICAgk/yXzYnmkZyCzI2CgrMNCiAqIEBwYXJhbVtpbl0gICAgIGZvcm1hdCAgICAgIJP8l82J5pGcgsyDdINIgVuDfYNig2cNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0hEUkNoZWNrZXJfaW5pdGlhbGl6ZSgNCiAgICBtb3JwaG9fSERSQ2hlY2tlciAqIGNvbnN0IHAsDQogICAgdm9pZCAqIGNvbnN0IGJ1ZmZlciwNCiAgICBjb25zdCBpbnQgYnVmZmVyX3NpemUsDQogICAgY29uc3QgaW50IHdpZHRoLA0KICAgIGNvbnN0IGludCBoZWlnaHQsDQogICAgY29uc3QgY2hhciAqZm9ybWF0KTsNCg0KLyoqDQogKiCDToOKgVuDk4NBg2KDdg0KICogaW5pdGlhbGl6ZSgpjsCNc4zjgsmOwI1zicKUXA0KICoNCiAqIEBwYXJhbVtpbixvdXRdIHAgSERSQ2hlY2tlcoNDg5ODWINeg5ODWA0KICogQHJldHVybiCDR4OJgVuDUoFbg2ggKHNlZSBtb3JwaG9fZXJyb3IuaCkNCiAqLw0KTU9SUEhPX0FQSShpbnQpDQptb3JwaG9fSERSQ2hlY2tlcl9maW5hbGl6ZSgNCiAgICBtb3JwaG9fSERSQ2hlY2tlciAqcCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioNCiAqIEhEUo53lVeMdo5agsyVcYq0kKuCzJDdkugNCiAqIGluaXRpYWxpemUoKY7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSBwICAgICAgICAgICBIRFJDaGVja2Vyg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1baW5dICAgICBzZW5zaXRpdml0eSCVcYq0kKsoTU9SUEhPX0hEUl9DSEVDS0VSX1NFTlNJVElWSVmX8YuTkcyCxY53kugpDQogKiBAcmV0dXJuIINHg4mBW4NSgVuDaCAoc2VlIG1vcnBob19lcnJvci5oKQ0KICovDQpNT1JQSE9fQVBJKGludCkNCm1vcnBob19IRFJDaGVja2VyX3NldFNlbnNpdGl2aXR5KA0KICAgIG1vcnBob19IRFJDaGVja2VyICogY29uc3QgcCwNCiAgICBNT1JQSE9fSERSX0NIRUNLRVJfU0VOU0lUSVZJVFkgc2Vuc2l0aXZpdHkpOw0KDQovKioNCiAqIEhEUo53lVeMdo5agsyVcYq0kKuCzI7mk74NCiAqIGluaXRpYWxpemUoKY7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSBwICAgICAgICAgICBIRFJDaGVja2Vyg0ODk4NYg16Dk4NYDQogKiBAcGFyYW1bb3V0XSAgICBzZW5zaXRpdml0eSCVcYq0kKuC1oLMg3yDQ4OTg14NCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0hEUkNoZWNrZXJfZ2V0U2Vuc2l0aXZpdHkoDQogICAgbW9ycGhvX0hEUkNoZWNrZXIgKiBjb25zdCBwLA0KICAgIE1PUlBIT19IRFJfQ0hFQ0tFUl9TRU5TSVRJVklUWSAqc2Vuc2l0aXZpdHkpOw0KDQovKioNCiAqIEhEUo53lVeCzJVdib8NCiAqIGluaXRpYWxpemUoKY7AjXOM44LJjsCNc4nClFwNCiAqDQogKiBAcGFyYW1baW4sb3V0XSBwICAgICAgSERSQ2hlY2tlcoNDg5ODWINeg5ODWA0KICogQHBhcmFtW291dF0gICAgcmVzdWx0IJVdib+Mi4nKgvCKaZRbgreC6ZR6l/Eol3aRZpCUNILMlHqX8SkNCiAqICAgICAgICAgICAgICAgICAgICAgICCXdpFmgqqU8YNbg42CzI/qjYeCyZHOiZ6Ct4LpibqLTILMmEmPb4LMieaRnIKqlUuXdoLGlLuS6A0KICogICAgICAgICAgICAgICAgICAgICAgIHsrMiwgKzEsIC0xLCAtMn2CzI+HgsmUu5LojIuJyoKqimmUW4KzguqC6Q0KICogQHBhcmFtW2luXSAgICAgaW5wdXRfaW1hZ2Ugk/yXzYnmkZwNCiAqIEByZXR1cm4gg0eDiYFbg1KBW4NoIChzZWUgbW9ycGhvX2Vycm9yLmgpDQogKi8NCk1PUlBIT19BUEkoaW50KQ0KbW9ycGhvX0hEUkNoZWNrZXJfZXZhbHVhdGUoDQogICAgbW9ycGhvX0hEUkNoZWNrZXIgKiBjb25zdCBwLA0KICAgIGludCAqIGNvbnN0IHJlc3VsdCwNCiAgICBjb25zdCBtb3JwaG9fSW1hZ2VEYXRhICogY29uc3QgaW5wdXRfaW1hZ2UpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYNCg0KI2VuZGlmIC8qIE1PUlBIT19IRFJfQ0hFQ0tFUl9IICovDQo=