API Integrations for Small Businesses: Practical Examples and Risks

14 min read 2,712 words
API Integrations for Small Businesses: Practical Examples and Risks featured image
YGBgaHRtbA0KPHA+SWYgeW91ciB0ZWFtIHNwZW5kcyB0aW1lIGV2ZXJ5IG1vcm5pbmcgY29weWluZyBib29raW5ncyBpbnRvIGEgc3ByZWFkc2hlZXQsIHJlY29uY2lsaW5nIHBheW1lbnRzIG1hbnVhbGx5LCBvciBleHBvcnRpbmcgY29udGFjdCBmb3JtIGRhdGEgaW50byB5b3VyIGVtYWlsIHRvb2wsIHlvdSBhcmUgcnVubmluZyBhIHByb2Nlc3MgdGhhdCBBUEkgaW50ZWdyYXRpb25zIGNhbiB1c3VhbGx5IGF1dG9tYXRlLiBGb3Igc21hbGwgVUsgYnVzaW5lc3NlcywgdGhpcyBpcyBub3QgYWJvdXQgYWRkaW5nIGNvbXBsZXhpdHkuIEl0IGlzIGFib3V0IHJlbW92aW5nIHRoZSByZXBldGl0aXZlIHdvcmsgdGhhdCBzbG93cyBncm93dGggYW5kIGludHJvZHVjZXMgZXJyb3JzLjwvcD4NCg0KPHA+QW4gQVBJIGludGVncmF0aW9uIGNvbm5lY3RzIHR3byBzb2Z0d2FyZSBzZXJ2aWNlcyBzbyB0aGV5IGV4Y2hhbmdlIGRhdGEgb3IgdHJpZ2dlciBhY3Rpb25zIGF1dG9tYXRpY2FsbHkuIEluc3RlYWQgb2YgYSB0ZWFtIG1lbWJlciBjb3B5aW5nIGluZm9ybWF0aW9uIGJldHdlZW4gdG9vbHMsIHRoZSBzeXN0ZW1zIGhhbmRsZSB0aGUgdHJhbnNmZXIuIFRoZSBwcmFjdGljYWwgcmVzdWx0IGlzIGZld2VyIG1pc3Rha2VzLCBmYXN0ZXIgcHJvY2Vzc2VzLCBhbmQgdGltZSBhdmFpbGFibGUgZm9yIHdvcmsgdGhhdCBhY3R1YWxseSBuZWVkcyBodW1hbiBhdHRlbnRpb24uPC9wPg0KDQo8cD5UaGlzIGFydGljbGUgZXhwbGFpbnMgd2hhdCBBUEkgaW50ZWdyYXRpb25zIGRvIGZvciBzbWFsbCBidXNpbmVzc2VzLCB3aGVyZSB0aGV5IGFkZCB0aGUgbW9zdCB2YWx1ZSwgd2hhdCBjYW4gZ28gd3JvbmcsIGhvdyB0byBldmFsdWF0ZSB3aGV0aGVyIHRvIGJ1aWxkIHRoZW0geW91cnNlbGYsIGFuZCB3aGF0IG1haW50ZW5hbmNlIGxvb2tzIGxpa2Ugb3ZlciB0aW1lLiBJdCBpcyB3cml0dGVuIGZvciBVSyBzbWFsbCBidXNpbmVzcyBvd25lcnMsIGZvdW5kZXJzLCBhbmQgYW55b25lIG1ha2luZyBkZWNpc2lvbnMgYWJvdXQgd2hlcmUgdG8gaW52ZXN0IGluIHRlY2huaWNhbCBpbXByb3ZlbWVudHMuPC9wPg0KDQo8aDI+V2hhdCBBUEkgaW50ZWdyYXRpb25zIGRvIGZvciBhIHNtYWxsIGJ1c2luZXNzPC9oMj4NCg0KPHA+QW4gQVBJLCBvciBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UsIGlzIGEgc2V0IG9mIHJ1bGVzIHRoYXQgbGV0cyB0d28gc29mdHdhcmUgc3lzdGVtcyB0YWxrIHRvIGVhY2ggb3RoZXIuIFdoZW4gb25lIHN5c3RlbSBoYXMgbmV3IGRhdGEsIGl0IHNlbmRzIGEgcmVxdWVzdCB0byB0aGUgb3RoZXIgdGhyb3VnaCB0aGUgQVBJLiBUaGUgcmVjZWl2aW5nIHN5c3RlbSBwcm9jZXNzZXMgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbmRzLiBUaGlzIGhhcHBlbnMgYXV0b21hdGljYWxseSwgd2l0aG91dCBzb21lb25lIHR5cGluZyBvciBjb3B5aW5nLjwvcD4NCg0KPHA+VGhlIHByYWN0aWNhbCBkaWZmZXJlbmNlIHNob3dzIHVwIGluIGV2ZXJ5ZGF5IHdvcmtmbG93czo8L3A+DQoNCjx1bD4NCiAgPGxpPkEgY3VzdG9tZXIgY29tcGxldGVzIGEgcGF5bWVudCBvbiB5b3VyIHdlYnNpdGUuIFRoZSBwYXltZW50IHByb2Nlc3NvciBzZW5kcyB0aGUgdHJhbnNhY3Rpb24gZGF0YSB0byB5b3VyIG9yZGVyIGRhdGFiYXNlIGFuZCB0cmlnZ2VycyBhIHJlY2VpcHQgZW1haWwgdG8gdGhlIGN1c3RvbWVyLCB3aXRob3V0IGFueW9uZSBtYW51YWxseSBlbnRlcmluZyB0aGUgYW1vdW50LjwvbGk+DQogIDxsaT5BIHZpc2l0b3Igc3VibWl0cyBhIGNvbnRhY3QgZm9ybS4gVGhlIHN1Ym1pc3Npb24gY3JlYXRlcyBhIGxlYWQgcmVjb3JkIGluIHlvdXIgQ1JNLCB0YWdzIGl0IHdpdGggdGhlIHNvdXJjZSwgYW5kIGFzc2lnbnMgYSBmb2xsb3ctdXAgdGFzayB0byB0aGUgcmlnaHQgdGVhbSBtZW1iZXIuPC9saT4NCiAgPGxpPkEgY2xpZW50IGJvb2tzIGFuIGFwcG9pbnRtZW50IHRocm91Z2ggeW91ciB3ZWJzaXRlLiBUaGUgYm9va2luZyBhcHBlYXJzIG9uIHlvdXIgY2FsZW5kYXIsIGEgY29uZmlybWF0aW9uIGdvZXMgb3V0IGF1dG9tYXRpY2FsbHksIGFuZCBhIHJlbWluZGVyIGlzIHNjaGVkdWxlZCBmb3IgdGhlIGRheSBiZWZvcmUuPC9saT4NCiAgPGxpPkludmVudG9yeSBsZXZlbHMgY2hhbmdlIG9uIHlvdXIgZS1jb21tZXJjZSBzaXRlLiBUaGUgdXBkYXRlIHN5bmNzIHRvIHlvdXIgd2FyZWhvdXNlIHRvb2wgc28gc3RvY2sgY291bnRzIHN0YXkgYWNjdXJhdGUgYWNyb3NzIGJvdGggc3lzdGVtcy48L2xpPg0KICA8bGk+QSBuZXcgc3Vic2NyaWJlciBqb2lucyB5b3VyIG1haWxpbmcgbGlzdC4gVGhlaXIgZGV0YWlscyBmbG93IGludG8geW91ciBlbWFpbCBwbGF0Zm9ybSBhbmQgdHJpZ2dlciBhIHdlbGNvbWUgc2VxdWVuY2Ugd2l0aG91dCBhbnkgZXhwb3J0IG9yIGltcG9ydCBzdGVwcy48L2xpPg0KPC91bD4NCg0KPHA+VGhlIHNwZWNpZmljIHRvb2xzIGludm9sdmVkIGRlcGVuZCBvbiB3aGF0IHlvdXIgYnVzaW5lc3MgYWxyZWFkeSB1c2VzLiBNb3N0IGVzdGFibGlzaGVkIHBsYXRmb3JtcywgaW5jbHVkaW5nIHBheW1lbnQgcHJvY2Vzc29ycywgZW1haWwgbWFya2V0aW5nIHNlcnZpY2VzLCBib29raW5nIHRvb2xzLCBDUk0gc3lzdGVtcywgYW5kIGFjY291bnRpbmcgc29mdHdhcmUsIG9mZmVyIGRvY3VtZW50ZWQgQVBJcy4gVGhlIGludGVncmF0aW9uIHdvcmsgaW52b2x2ZXMgbWFwcGluZyBkYXRhIGZpZWxkcyBiZXR3ZWVuIHN5c3RlbXMsIHNldHRpbmcgdXAgYXV0aGVudGljYXRpb24sIGFuZCBoYW5kbGluZyBlcnJvcnMgd2hlbiB0aGV5IG9jY3VyLjwvcD4NCg0KPGgyPldoeSBzbWFsbCBidXNpbmVzc2VzIGludmVzdCBpbiBpbnRlZ3JhdGlvbiB3b3JrPC9oMj4NCg0KPHA+VGhlIGNsZWFyZXN0IGJlbmVmaXQgaXMgdGltZSBzYXZlZCBvbiByZXBldGl0aXZlIHRhc2tzLiBJZiB5b3VyIGJ1c2luZXNzIGhhbmRsZXMgdGVuIGJvb2tpbmdzIGEgZGF5IGFuZCBlYWNoIG9uZSByZXF1aXJlcyB0d28gbWludXRlcyBvZiBtYW51YWwgZW50cnkgaW50byBhIGNhbGVuZGFyIGFuZCBhIHNwcmVhZHNoZWV0LCB0aGF0IGlzIHJvdWdobHkgdGhyZWUgYW5kIGEgaGFsZiBob3VycyBvZiB3b3JrIHBlciB3ZWVrLiBPdmVyIGEgeWVhciwgaXQgaXMgY2xvc2UgdG8gdHdvIHdvcmtpbmcgd2Vla3Mgb2YgYWRtaW4gdGltZSB0aGF0IGF1dG9tYXRpb24gcmVtb3Zlcy48L3A+DQoNCjxwPkJleW9uZCB0aW1lLCB0aGVyZSBpcyB0aGUgZXJyb3IgcmVkdWN0aW9uIGZhY3Rvci4gTWFudWFsIGRhdGEgZW50cnkgaW50cm9kdWNlcyBtaXN0YWtlcy4gQSBtaXNzZWQgZGVjaW1hbCBpbiBhbiBpbnZvaWNlIGFtb3VudCwgYSB3cm9uZyBlbWFpbCBhZGRyZXNzIGluIGEgY29udGFjdCByZWNvcmQsIG9yIGEgYm9va2luZyBlbnRlcmVkIGludG8gdGhlIHdyb25nIGRhdGUgY2FuIHRha2UgbW9yZSB0aW1lIHRvIHJlc29sdmUgdGhhbiB0aGUgb3JpZ2luYWwgZW50cnkgd291bGQgaGF2ZSB0YWtlbi4gQ29ubmVjdGVkIHN5c3RlbXMgcmVkdWNlIHRoZXNlIGVycm9ycyBiZWNhdXNlIHRoZSBkYXRhIG1vdmVzIHdpdGhvdXQgcmUtdHlwaW5nLjwvcD4NCg0KPHA+U2NhbGFiaWxpdHkgaW1wcm92ZXMgd2hlbiBwcm9jZXNzZXMgZG8gbm90IHJlcXVpcmUgcHJvcG9ydGlvbmFsIGFkbWluIGVmZm9ydCBhcyB0aGUgYnVzaW5lc3MgZ3Jvd3MuIEEgd29ya2Zsb3cgdGhhdCBoYW5kbGVzIHR3ZW50eSBjbGllbnRzIGEgd2VlayBkb2VzIG5vdCBuZWVkIHJlZGVzaWduaW5nIHdoZW4gdGhhdCBudW1iZXIgcmVhY2hlcyBzaXh0eSwgcHJvdmlkZWQgdGhlIGludGVncmF0aW9uIGhhbmRsZXMgdGhlIGluY3JlYXNlZCB2b2x1bWUgYW5kIGVycm9yIGNoZWNraW5nIHJlbWFpbnMgcm9idXN0LjwvcD4NCg0KPHA+UmVwb3J0aW5nIGltcHJvdmVzIHRvby4gV2hlbiBkYXRhIGxpdmVzIGluIGNvbm5lY3RlZCBzeXN0ZW1zIHJhdGhlciB0aGFuIHNjYXR0ZXJlZCBhY3Jvc3Mgc3ByZWFkc2hlZXRzLCBwdWxsaW5nIGEgd2Vla2x5IHN1bW1hcnkgdGFrZXMgbWludXRlcyBpbnN0ZWFkIG9mIGhvdXJzIGdhdGhlcmluZyBpbmZvcm1hdGlvbiBmcm9tIG11bHRpcGxlIHNvdXJjZXMuIFRoaXMgbWF0dGVycyBmb3IgYnVzaW5lc3NlcyB0cmFja2luZyBlbnF1aXJpZXMsIGNvbnZlcnNpb25zLCBzdG9jayBtb3ZlbWVudCwgb3IgY3VzdG9tZXIgYWN0aXZpdHkuPC9wPg0KDQo8cD5Gb3IgYnVzaW5lc3NlcyBsb29raW5nIGF0IHRoZWlyIHRlY2hub2xvZ3kgc2V0dXAgbW9yZSBicm9hZGx5LCB1bmRlcnN0YW5kaW5nIGhvdyBpbnRlZ3JhdGlvbnMgZml0IGludG8gdGhlIG92ZXJhbGwgc3RyYXRlZ3kgaXMgd29ydGggY29uc2lkZXJpbmcgYWxvbmdzaWRlIG90aGVyIGVmZmljaWVuY3kgaW1wcm92ZW1lbnRzLiA8YSBocmVmPSIvYmxvZy9zbWFsbC1idXNpbmVzcy10ZWNobm9sb2d5LXdpdGhvdXQtY3JlYXRpbmctbW9yZS13b3JrIj5Ib3cgc21hbGwgYnVzaW5lc3NlcyBjYW4gdXNlIHRlY2hub2xvZ3kgd2l0aG91dCBjcmVhdGluZyBtb3JlIHdvcms8L2E+IGNvdmVycyByZWxhdGVkIGRlY2lzaW9ucyBhYm91dCB3aGVuIHRvIGFkZCB0b29scyB2ZXJzdXMgc2ltcGxpZnlpbmcgd2hhdCBhbHJlYWR5IGV4aXN0cy48L3A+DQoNCjxoMj5Db21tb24gQVBJIGludGVncmF0aW9uIHNjZW5hcmlvcyBmb3IgVUsgc21hbGwgYnVzaW5lc3NlczwvaDI+DQoNCjxoMz5QYXltZW50IHByb2Nlc3NpbmcgY29ubmVjdGlvbnM8L2gzPg0KDQo8cD5Db25uZWN0aW5nIGEgcGF5bWVudCBwcm9jZXNzb3IgdG8geW91ciB3ZWJzaXRlIG9yIG9yZGVyIHN5c3RlbSBpcyBvbmUgb2YgdGhlIG1vc3QgZnJlcXVlbnQgaW50ZWdyYXRpb24gbmVlZHMgZm9yIGJ1c2luZXNzZXMgc2VsbGluZyBvbmxpbmUgb3IgdGFraW5nIGNhcmQgcGF5bWVudHMgaW4gcGVyc29uLiBXaGVuIGEgY3VzdG9tZXIgcGF5cywgdGhlIHRyYW5zYWN0aW9uIGRhdGEgbmVlZHMgdG8gcmVhY2ggdGhlIHJpZ2h0IHBsYWNlczogdGhlIG9yZGVyIGRhdGFiYXNlLCB5b3VyIGFjY291bnRpbmcgdG9vbCwgYW5kIHlvdXIgY3VzdG9tZXIgbm90aWZpY2F0aW9uIHN5c3RlbS48L3A+DQoNCjxwPlN0cmlwZSwgUGF5UGFsLCBhbmQgU3F1YXJlIG9mZmVyIEFQSXMgdGhhdCBoYW5kbGUgY2FyZCBwYXltZW50cyBhbmQgcGFzcyB0cmFuc2FjdGlvbiBkYXRhIHRvIG90aGVyIHN5c3RlbXMuIEEgdHlwaWNhbCBzbWFsbCBidXNpbmVzcyBzZXR1cCBjb25uZWN0cyB0aGUgcGF5bWVudCBwcm9jZXNzb3IgdG8gYSBkYXRhYmFzZSB3aGVyZSBvcmRlcnMgYXJlIHN0b3JlZCwgYW5kIHRvIGFuIGVtYWlsIHRvb2wgdGhhdCBzZW5kcyBhIHJlY2VpcHQuIEZvciBidXNpbmVzc2VzIGhhbmRsaW5nIGNhcmQgcGF5bWVudHMsIGtlZXBpbmcgY2FyZCBkYXRhIG9uIHRoZSBwcm9jZXNzb3IncyBzaWRlIHJhdGhlciB0aGFuIHN0b3JpbmcgaXQgaW4geW91ciBvd24gc3lzdGVtcyBpcyB0aGUgcHJhY3RpY2FsIGFwcHJvYWNoIHRvIFBDSSBEU1Mgb2JsaWdhdGlvbnMuPC9wPg0KDQo8cD5UaGUga2V5IHBvaW50IGlzIHRoYXQgcGF5bWVudCBpbnRlZ3JhdGlvbnMgd29yayByZWxpYWJseSB3aGVuIHRoZXkgYXJlIHNldCB1cCB0byBoYW5kbGUgYm90aCB0aGUgaGFwcHkgcGF0aCBhbmQgdGhlIGVycm9yIGNhc2VzLiBBbiBpbnRlZ3JhdGlvbiB0aGF0IHJlY29yZHMgc3VjY2Vzc2Z1bCBwYXltZW50cyBidXQgc2lsZW50bHkgZmFpbHMgb24gZGVjbGluZWQgY2FyZHMgb3IgbmV0d29yayBlcnJvcnMgY3JlYXRlcyByZWNvbmNpbGlhdGlvbiBwcm9ibGVtcyB0aGF0IGFyZSBkaWZmaWN1bHQgdG8gdW50YW5nbGUgbGF0ZXIuPC9wPg0KDQo8aDM+Qm9va2luZyBhbmQgYXBwb2ludG1lbnQgc3lzdGVtczwvaDM+DQoNCjxwPlNlcnZpY2UgYnVzaW5lc3NlcyBzdWNoIGFzIHNhbG9ucywgY2xpbmljcywgdHV0b3JzLCBhbmQgdHJhZGVzcGVvcGxlIGZyZXF1ZW50bHkgbmVlZCBhIGJvb2tpbmcgc3lzdGVtIHRoYXQgY29ubmVjdHMgdG8gdGhlaXIgZXhpc3RpbmcgY2FsZW5kYXIgYW5kIG5vdGlmaWNhdGlvbiB0b29scy4gQSB3ZWxsLWludGVncmF0ZWQgYm9va2luZyBmbG93IHNlbmRzIGFwcG9pbnRtZW50cyB0byBhIGNhbGVuZGFyLCB0cmlnZ2VycyBjb25maXJtYXRpb24gZW1haWxzLCBhbmQgcmVjb3JkcyB0aGUgYm9va2luZyBkZXRhaWxzIHNvbWV3aGVyZSB0aGUgYnVzaW5lc3MgY2FuIHJldmlldyB0aGVtIHdpdGhvdXQgc3dpdGNoaW5nIGJldHdlZW4gdG9vbHMuPC9wPg0KDQo8cD5Gb3IgYnVzaW5lc3NlcyBidWlsZGluZyBjdXN0b20gYm9va2luZyBmdW5jdGlvbmFsaXR5LCBjb25uZWN0aW5nIHRvIGVzdGFibGlzaGVkIGNhbGVuZGFyIHNlcnZpY2VzIHZpYSB0aGVpciBBUEkgaXMgdXN1YWxseSBtb3JlIHJlbGlhYmxlIHRoYW4gbWFpbnRhaW5pbmcgYSBjdXN0b20gY2FsZW5kYXIgaW1wbGVtZW50YXRpb24uIE1vc3QgY2FsZW5kYXIgcHJvdmlkZXJzIGhhbmRsZSBjYWxlbmRhciBjb25mbGljdHMsIHRpbWV6b25lIGhhbmRsaW5nLCBhbmQgcmVjdXJyaW5nIGV2ZW50cyBpbiB3YXlzIHRoYXQgd291bGQgdGFrZSBzaWduaWZpY2FudCBkZXZlbG9wbWVudCB0aW1lIHRvIHJlcGxpY2F0ZS48L3A+DQoNCjxoMz5DUk0gYW5kIG1hcmtldGluZyB0b29sIGNvbm5lY3Rpb25zPC9oMz4NCg0KPHA+Q29ubmVjdGluZyB5b3VyIHdlYnNpdGUgY29udGFjdCBmb3JtIHRvIHlvdXIgQ1JNIG9yIGVtYWlsIHBsYXRmb3JtIG1lYW5zIG5ldyBsZWFkcyBlbnRlciB5b3VyIHN5c3RlbSBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBzb21lb25lIHRvIGV4cG9ydCBhbmQgaW1wb3J0IGRhdGEuIEZvciBidXNpbmVzc2VzIHdpdGggYWN0aXZlIHNhbGVzIGZvbGxvdy11cCBvciBtYXJrZXRpbmcgc2VxdWVuY2VzLCB0aGlzIGF1dG9tYXRpb24gcmVkdWNlcyB0aGUgZ2FwIGJldHdlZW4gZW5xdWlyeSBhbmQgcmVzcG9uc2UuPC9wPg0KDQo8cD5UaGUgY29ubmVjdGlvbiB0byBhIENSTSB0YWtlcyB0aGlzIGZ1cnRoZXIgYnkgY3JlYXRpbmcgc3RydWN0dXJlZCByZWNvcmRzLCB0YWdnaW5nIGxlYWRzIGJhc2VkIG9uIGhvdyB0aGV5IGNhbWUgaW4sIGFuZCB0cmlnZ2VyaW5nIGZvbGxvdy11cCB0YXNrcyBhdXRvbWF0aWNhbGx5LiBUaGlzIHR5cGUgb2Ygd29ya2Zsb3cgaXMgY29tbW9uIGluIGJ1c2luZXNzZXMgd2hlcmUgcmVzcG9uc2Ugc3BlZWQgYWZmZWN0cyBjb252ZXJzaW9uLjwvcD4NCg0KPGgzPkFjY291bnRpbmcgYW5kIGludmVudG9yeSBzeXN0ZW1zPC9oMz4NCg0KPHA+Rm9yIGJ1c2luZXNzZXMgbWFuYWdpbmcgcGh5c2ljYWwgc3RvY2sgb3IgbmVlZGluZyBhY2N1cmF0ZSBmaW5hbmNpYWwgcmVjb3JkcywgY29ubmVjdGluZyBlLWNvbW1lcmNlIG9yIHBvaW50LW9mLXNhbGUgc3lzdGVtcyB0byBhY2NvdW50aW5nIHNvZnR3YXJlIHJlZHVjZXMgdGhlIG1hbnVhbCBib29ra2VlcGluZyB3b3JrIGF0IG1vbnRoIGVuZC4gSW52b2ljZSBkYXRhLCBwYXltZW50IGNvbmZpcm1hdGlvbnMsIGFuZCBzdG9jayBtb3ZlbWVudHMgZmxvdyBiZXR3ZWVuIHN5c3RlbXMgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIGEgYm9va2tlZXBlciB0byByZWNvbmNpbGUgcmVjb3JkcyBtYW51YWxseS48L3A+DQoNCjxwPlRoZXNlIGludGVncmF0aW9ucyBhcmUgcGFydGljdWxhcmx5IHZhbHVhYmxlIHdoZW4gdGhlIGJ1c2luZXNzIGdyb3dzIHBhc3QgdGhlIHBvaW50IHdoZXJlIGEgc2luZ2xlIHBlcnNvbiBjYW4ga2VlcCB0cmFjayBvZiBhbGwgdHJhbnNhY3Rpb25zIG1hbnVhbGx5LiBUaGV5IGFsc28gcmVkdWNlIHRoZSByaXNrIG9mIGVycm9ycyBpbiBmaW5hbmNpYWwgcmVjb3Jkcywgd2hpY2ggbWF0dGVycyB3aGVuIHByZXBhcmluZyBhY2NvdW50cyBvciBkZWFsaW5nIHdpdGggdGF4IG9ibGlnYXRpb25zLjwvcD4NCg0KPGgyPkEgcHJhY3RpY2FsIGludGVncmF0aW9uIGV4YW1wbGU8L2gyPg0KDQo8cD5Db25zaWRlciBhIHNtYWxsIFVLIGNvbnN1bHRhbmN5IHRoYXQgdGFrZXMgb24gYWJvdXQgZmlmdGVlbiBjbGllbnQgZW5xdWlyaWVzIHBlciB3ZWVrIHRocm91Z2ggYSB3ZWJzaXRlIGNvbnRhY3QgZm9ybS4gSGlzdG9yaWNhbGx5LCB0aGUgcHJvY2VzcyBsb29rZWQgbGlrZSB0aGlzOjwvcD4NCg0KPG9sPg0KICA8bGk+V2Vic2l0ZSB2aXNpdG9yIHN1Ym1pdHMgYSBmb3JtLjwvbGk+DQogIDxsaT5Pd25lciByZWNlaXZlcyBhbiBlbWFpbCBub3RpZmljYXRpb24uPC9saT4NCiAgPGxpPk93bmVyIG1hbnVhbGx5IGNyZWF0ZXMgYSBjb250YWN0IGluIHRoZWlyIENSTS48L2xpPg0KICA8bGk+T3duZXIgY3JlYXRlcyBhIHRhc2sgdG8gZm9sbG93IHVwLjwvbGk+DQogIDxsaT5Pd25lciBsb2dzIHRoZSBlbnF1aXJ5IGluIGEgc3ByZWFkc2hlZXQgZm9yIHRyYWNraW5nLjwvbGk+DQo8L29sPg0KDQo8cD5UaGlzIHRha2VzIHJvdWdobHkgZml2ZSBtaW51dGVzIHBlciBlbnF1aXJ5LiBPdmVyIGEgd2VlaywgaXQgaXMgb3ZlciBhbiBob3VyIG9mIGFkbWluIHdvcmsgdGhhdCBhZGRzIG5vIHZhbHVlIHRvIGNsaWVudHMuIFRoZSByaXNrIG9mIG1pc3NlZCBmb2xsb3ctdXBzIGdyb3dzIHdoZW4gdGhlIG93bmVyIGlzIGJ1c3kgd2l0aCBjbGllbnQgd29yayBhbmQgdGhlIGVucXVpcnkgZW1haWwgc2l0cyB1bnJlYWQgZm9yIGEgZGF5IG9yIHR3by48L3A+DQoNCjxwPlRoZSBpbnRlZ3JhdGVkIHZlcnNpb24gY29ubmVjdHMgdGhlIGNvbnRhY3QgZm9ybSB0byB0aGUgQ1JNIHZpYSBBUEkuIFdoZW4gYSBmb3JtIGlzIHN1Ym1pdHRlZCwgdGhlIENSTSBjcmVhdGVzIGEgY29udGFjdCByZWNvcmQsIGFzc2lnbnMgYSBmb2xsb3ctdXAgdGFzayB3aXRoaW4gYSBzZXQgdGltZWZyYW1lLCBhbmQgc2VuZHMgYW4gYXV0b21hdGljIGFja25vd2xlZGdlbWVudCB0byB0aGUgdmlzaXRvci4gVGhlIG93bmVyIHJldmlld3MgdGhlIHRhc2sgbGlzdCBlYWNoIG1vcm5pbmcgYW5kIGZvbGxvd3MgdXAgb24gZW5xdWlyaWVzIHRoYXQgYXJyaXZlZCB3aGlsZSB0aGV5IHdlcmUgd29ya2luZy4gVGhlIGVucXVpcnkgdHJhY2tpbmcgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgdGhlIENSTSBsb2dzIHRoZSBzb3VyY2UgYW5kIHRpbWVzdGFtcC48L3A+DQoNCjxwPlRoZSBzZXR1cCB0YWtlcyBhIGZldyBob3VycyB0byBidWlsZCBhbmQgdGVzdC4gVGhlIHRpbWUgc2F2aW5nIGFjY3VtdWxhdGVzIGV2ZXJ5IHdlZWsgdGhlcmVhZnRlci4gVGhlIHF1YWxpdHkgb2YgZm9sbG93LXVwIGltcHJvdmVzIGJlY2F1c2UgcmVzcG9uc2UgdGltZSBkcm9wcyBmcm9tIGRheXMgdG8gaG91cnMuPC9wPg0KDQo8aDI+Umlza3MgdGhhdCBjb21lIHdpdGggQVBJIGludGVncmF0aW9uczwvaDI+DQoNCjxwPkludGVncmF0aW9ucyBpbnRyb2R1Y2UgZGVwZW5kZW5jaWVzIGJldHdlZW4gc3lzdGVtcy4gV2hlbiBvbmUgc3lzdGVtIGNoYW5nZXMsIHRoZSBpbnRlZ3JhdGlvbiBjYW4gYnJlYWsuIFdoZW4gYW4gQVBJIHByb3ZpZGVyIHVwZGF0ZXMgYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzIG9yIGRlcHJlY2F0ZXMgYW4gZW5kcG9pbnQsIHRoZSBpbnRlZ3JhdGlvbiBtYXkgc3RvcCB3b3JraW5nIHVudGlsIHNvbWVvbmUgdXBkYXRlcyBpdC4gVW5kZXJzdGFuZGluZyB0aGVzZSByaXNrcyBoZWxwcyB3aGVuIGRlY2lkaW5nIGhvdyBtdWNoIHRvIGF1dG9tYXRlIGFuZCBob3cgdG8gbWFpbnRhaW4gd2hhdCB5b3UgYnVpbGQuPC9wPg0KDQo8aDM+U2lsZW50IGZhaWx1cmVzPC9oMz4NCg0KPHA+VGhlIG1vc3QgY29tbW9uIHJpc2sgaXMgYW4gaW50ZWdyYXRpb24gZmFpbGluZyB3aXRob3V0IGFueW9uZSBub3RpY2luZyBpbW1lZGlhdGVseS4gSWYgYSBwYXltZW50IGludGVncmF0aW9uIHN0b3BzIHJlY29yZGluZyBvcmRlcnMgYnV0IHRyYW5zYWN0aW9ucyBzdGlsbCBwcm9jZXNzIHRocm91Z2ggdGhlIHBheW1lbnQgcHJvY2Vzc29yLCBjdXN0b21lcnMgcmVjZWl2ZSByZWNlaXB0cyBidXQgeW91ciBidXNpbmVzcyBoYXMgbm8gb3JkZXIgcmVjb3JkLiBUaGUgZ2FwIG1heSBnbyB1bm5vdGljZWQgdW50aWwgcmVjb25jaWxpYXRpb24gc2hvd3MgYSBkaXNjcmVwYW5jeSBvciBhIGN1c3RvbWVyIGFza3MgYWJvdXQgYW4gb3JkZXIgdGhhdCBkb2VzIG5vdCBhcHBlYXIgaW4geW91ciBzeXN0ZW0uPC9wPg0KDQo8cD5UaGlzIGlzIHdoeSBtb25pdG9yaW5nIG1hdHRlcnMuIEFuIGludGVncmF0aW9uIHdpdGhvdXQgZXJyb3IgbG9nZ2luZyBhbmQgYWxlcnRpbmcgaXMgYSByaXNrIHRoYXQgY29tcG91bmRzIG92ZXIgdGltZS4gVGhlIGxvbmdlciBhIGZhaWx1cmUgZ29lcyB1bmRldGVjdGVkLCB0aGUgbW9yZSBkYXRhIGlzIGFmZmVjdGVkIGFuZCB0aGUgaGFyZGVyIGl0IGJlY29tZXMgdG8gcmVjb25zdHJ1Y3Qgd2hhdCBoYXBwZW5lZC48L3A+DQoNCjxwPldoZW4gYW4gQVBJIHByb3ZpZGVyIG1ha2VzIGNoYW5nZXMsIGtlZXBpbmcgdHJhY2sgb2Ygd2hhdCB5b3VyIGJ1c2luZXNzIGRlcGVuZHMgb24gaGVscHMuIDxhIGhyZWY9Ii9ibG9nL29wZW5haS1haS10b29sLXVwZGF0ZXMtc21hbGwtYnVzaW5lc3MtYXV0b21hdGlvbi1jaGVja3MiPkNoZWNraW5nIGZvciBBUEkgdXBkYXRlcyBiZWZvcmUgYXV0b21hdGluZyBidXNpbmVzcyB3b3JrZmxvd3M8L2E+IGNvdmVycyBob3cgdG8gbW9uaXRvciBmb3IgY2hhbmdlcyB0aGF0IGNvdWxkIGFmZmVjdCB5b3VyIGludGVncmF0aW9ucy48L3A+DQoNCjxoMz5BUEkgY2hhbmdlcyBhbmQgdmVyc2lvbiB1cGRhdGVzPC9oMz4NCg0KPHA+QVBJIHByb3ZpZGVycyB1cGRhdGUgdGhlaXIgaW50ZXJmYWNlcy4gQSBmaWVsZCB0aGF0IGV4aXN0ZWQgbGFzdCB5ZWFyIG1heSBiZSByZW5hbWVkIG9yIHJlbW92ZWQuIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgY2hhbmdlLiBSYXRlIGxpbWl0cyBnZXQgdGlnaHRlci4gVGhlc2UgYXJlIG5vcm1hbCBwYXJ0cyBvZiBtYWludGFpbmluZyBhIHNvZnR3YXJlIHByb2R1Y3QsIGJ1dCB0aGV5IG1lYW4gYW4gaW50ZWdyYXRpb24gYnVpbHQgdG9kYXkgbWF5IG5lZWQgYXR0ZW50aW9uIHdpdGhpbiBzaXggdG8gdHdlbHZlIG1vbnRocy48L3A+DQoNCjxwPk1ham9yIHByb3ZpZGVycyBsaWtlIFN0cmlwZSwgR29vZ2xlLCBhbmQgVHdpbGlvIG1haW50YWluIEFQSSB2ZXJzaW9uIGhpc3RvcmllcyBhbmQgcHVibGlzaCBjaGFuZ2Vsb2dzIHdpdGggcmVhc29uYWJsZSBub3RpY2UgYmVmb3JlIGJyZWFraW5nIGNoYW5nZXMuIFN1YnNjcmliaW5nIHRvIHRoZXNlIG5vdGlmaWNhdGlvbnMgYW5kIHJldmlld2luZyB0aGVtIHBlcmlvZGljYWxseSBoZWxwcyB5b3Ugc3RheSBhaGVhZCBvZiBpc3N1ZXMuPC9wPg0KDQo8aDM+U2VjdXJpdHkgY29uc2lkZXJhdGlvbnM8L2gzPg0KDQo8cD5FdmVyeSBpbnRlZ3JhdGlvbiBwb2ludCBpcyBhIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSBpZiBpdCBpcyBub3QgaW1wbGVtZW50ZWQgY2FyZWZ1bGx5LiBBbiBBUEkga2V5IHN0b3JlZCBpbiBwbGFpbiB0ZXh0IG9uIGEgc2VydmVyLCBhIHdlYmhvb2sgZW5kcG9pbnQgd2l0aG91dCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBvciBhbiBpbnRlZ3JhdGlvbiB0b2tlbiB3aXRoIG1vcmUgcGVybWlzc2lvbnMgdGhhbiBpdCBuZWVkcyBjYW4gZXhwb3NlIGJ1c2luZXNzIGRhdGEgb3IgYWxsb3cgdW5pbnRlbmRlZCBhY3Rpb25zLjwvcD4NCg0KPHA+UHJhY3RpY2FsIHNlY3VyaXR5IHN0ZXBzIGluY2x1ZGUgc3RvcmluZyBBUEkga2V5cyBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgYSBzZWNyZXRzIG1hbmFnZXIgcmF0aGVyIHRoYW4gaW4gY29kZSBmaWxlcywgdmVyaWZ5aW5nIHdlYmhvb2sgc2lnbmF0dXJlcyB0byBjb25maXJtIHJlcXVlc3RzIGFyZSBnZW51aW5lIGJlZm9yZSBwcm9jZXNzaW5nIHRoZW0sIGFuZCBzY29waW5nIGludGVncmF0aW9uIHBlcm1pc3Npb25zIHRvIG9ubHkgd2hhdCB0aGUgaW50ZWdyYXRpb24gbmVlZHMgdG8gZnVuY3Rpb24uIEFuIGludGVncmF0aW9uIHRoYXQgb25seSByZWFkcyBkYXRhIHNob3VsZCBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9ucy48L3A+DQoNCjxoMz5WZW5kb3IgbG9jay1pbiBhbmQgc3dpdGNoaW5nIGNvc3RzPC9oMz4NCg0KPHA+QnVpbGRpbmcgd29ya2Zsb3dzIHRoYXQgZGVwZW5kIGhlYXZpbHkgb24gYSBzcGVjaWZpYyB0b29sIGNyZWF0ZXMgc3dpdGNoaW5nIGNvc3RzLiBJZiBhIFNhYVMgcHJvdmlkZXIgY2hhbmdlcyBwcmljaW5nIHNpZ25pZmljYW50bHksIGdldHMgYWNxdWlyZWQsIG9yIHNodXRzIGRvd24sIHRoZSBpbnRlZ3JhdGlvbnMgYnVpbHQgYXJvdW5kIHRoZW0gbWF5IG5lZWQgcmVidWlsZGluZy48L3A+DQoNCjxwPlRoaXMgaXMgbm90IGEgcmVhc29uIHRvIGF2b2lkIGludGVncmF0aW9ucywgYnV0IGl0IGlzIHdvcnRoIGNvbnNpZGVyaW5nIHdoZW4gZXZhbHVhdGluZyBob3cgZGVlcGx5IHRvIGNvbm5lY3Qgc3lzdGVtcy4gQSBsaWdodHdlaWdodCBpbnRlZ3JhdGlvbiB0aGF0IGNvdWxkIGJlIHJlcGxhY2VkIGluIGEgZGF5IGlzIGxlc3Mgcmlza3kgdGhhbiBhIGRlZXBseSBlbWJlZGRlZCBkZXBlbmRlbmN5IHRoYXQgd291bGQgdGFrZSB3ZWVrcyB0byBtaWdyYXRlLjwvcD4NCg0KPGgyPldoYXQgdG8gY2hlY2sgYmVmb3JlIGJ1aWxkaW5nIGFuIGludGVncmF0aW9uPC9oMj4NCg0KPHA+QmVmb3JlIHN0YXJ0aW5nIGFueSBpbnRlZ3JhdGlvbiB3b3JrLCBhIGZldyBwcmFjdGljYWwgY2hlY2tzIGhlbHAgYXZvaWQgcHJvYmxlbXMgbGF0ZXIuPC9wPg0KDQo8dWw+DQogIDxsaT48c3Ryb25nPkFQSSBkb2N1bWVudGF0aW9uIHJldmlldzo8L3N0cm9uZz4gTW9zdCBlc3RhYmxpc2hlZCBzZXJ2aWNlcyBwdWJsaXNoIGRvY3VtZW50YXRpb24gY292ZXJpbmcgYXV0aGVudGljYXRpb24sIGF2YWlsYWJsZSBlbmRwb2ludHMsIHJhdGUgbGltaXRzLCBlcnJvciBoYW5kbGluZywgYW5kIGV4YW1wbGUgcmVzcG9uc2VzLiBSZWFkaW5nIHRoaXMgYmVmb3JlIHdyaXRpbmcgY29kZSBjbGFyaWZpZXMgd2hhdCBpcyBwb3NzaWJsZSBhbmQgd2hhdCBsaW1pdGF0aW9ucyBleGlzdC48L2xpPg0KICA8bGk+PHN0cm9uZz5EYXRhIG1hcHBpbmc6PC9zdHJvbmc+IElkZW50aWZ5IHdoaWNoIGZpZWxkcyBmcm9tIHRoZSBzb3VyY2Ugc3lzdGVtIGNvcnJlc3BvbmQgdG8gZmllbGRzIGluIHRoZSB0YXJnZXQgc3lzdGVtLiBBIG1pc21hdGNoIGhlcmUgY2F1c2VzIGRhdGEgY29ycnVwdGlvbiBvciBsb3N0IGluZm9ybWF0aW9uLiBTcGVuZGluZyB0aW1lIG9uIHRoaXMgdXBmcm9udCBzYXZlcyBkZWJ1Z2dpbmcgbGF0ZXIuPC9saT4NCiAgPGxpPjxzdHJvbmc+RXJyb3IgaGFuZGxpbmcgcGxhbjo8L3N0cm9uZz4gRGVjaWRlIHdoYXQgaGFwcGVucyB3aGVuIGFuIEFQSSBjYWxsIGZhaWxzLiBPcHRpb25zIGluY2x1ZGUgcmV0cnlpbmcgd2l0aCBiYWNrb2ZmLCBsb2dnaW5nIHRoZSBlcnJvciBmb3IgbWFudWFsIHJldmlldywgb3Igc2VuZGluZyBhbiBhbGVydCB0byBzb21lb25lIHdobyBjYW4gaW52ZXN0aWdhdGUuIFNpbGVudCBmYWlsdXJlcyBjYXVzZSB0aGUgbW9zdCBkYW1hZ2UuPC9saT4NCiAgPGxpPjxzdHJvbmc+QXV0aGVudGljYXRpb24gbWV0aG9kOjwvc3Ryb25nPiBDb25maXJtIHdoZXRoZXIgdGhlIEFQSSB1c2VzIEFQSSBrZXlzLCBPQXV0aCB0b2tlbnMsIG9yIGFub3RoZXIgbWV0aG9kLCBhbmQgd2hldGhlciB0aGUgYWNjZXNzIGxldmVscyBtYXRjaCB3aGF0IHRoZSBpbnRlZ3JhdGlvbiBuZWVkcyB0byBkby48L2xpPg0KICA8bGk+PHN0cm9uZz5SYXRlIGxpbWl0cyBhbmQgcXVvdGFzOjwvc3Ryb25nPiBTb21lIEFQSXMgbGltaXQgcmVxdWVzdHMgcGVyIG1pbnV0ZSBvciBwZXIgZGF5LiBJZiB5b3VyIGludGVncmF0aW9uIHByb2Nlc3NlcyBtYW55IHJlY29yZHMsIHJhdGUgbGltaXRzIGFmZmVjdCBkZXNpZ24gY2hvaWNlcyBzdWNoIGFzIGJhdGNoIHByb2Nlc3NpbmcgdmVyc3VzIHJlYWwtdGltZSBjYWxscy48L2xpPg0KICA8bGk+PHN0cm9uZz5TdGFnaW5nIGVudmlyb25tZW50Ojwvc3Ryb25nPiBUZXN0IHRoZSBpbnRlZ3JhdGlvbiBpbiBhIG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50IGJlZm9yZSBjb25uZWN0aW5nIGl0IHRvIGxpdmUgc3lzdGVtcy4gTW9zdCBtYWpvciBwbGF0Zm9ybXMgb2ZmZXIgc2FuZGJveCBvciB0ZXN0IG1vZGVzIGZvciB0aGlzIHB1cnBvc2UuPC9saT4NCjwvdWw+DQoNCjxoMj5Db21tb24gbWlzdGFrZXMgd2hlbiBzZXR0aW5nIHVwIGludGVncmF0aW9uczwvaDI+DQoNCjxoMz5IYXJkY29kaW5nIGNyZWRlbnRpYWxzPC9oMz4NCg0KPHA+UHV0dGluZyBBUEkga2V5cyBkaXJlY3RseSBpbnRvIGNvZGUgZmlsZXMgaXMgYSBzaG9ydGN1dCB0aGF0IGNyZWF0ZXMgc2VjdXJpdHkgYW5kIG1haW50ZW5hbmNlIHByb2JsZW1zLiBLZXlzIGluIHZlcnNpb24gY29udHJvbCBnZXQgZXhwb3NlZCB3aGVuIHJlcG9zaXRvcmllcyBhcmUgc2hhcmVkIG9yIG1hZGUgcHVibGljLiBUaGV5IGFsc28gbmVlZCBtYW51YWwgdXBkYXRlcyB3aGVuZXZlciB0aGV5IGNoYW5nZSByYXRoZXIgdGhhbiBiZWluZyBtYW5hZ2VkIGNlbnRyYWxseS48L3A+DQoNCjxwPkEgYmV0dGVyIGFwcHJvYWNoIGlzIHRvIHN0b3JlIGNyZWRlbnRpYWxzIGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBhIHNlY3JldHMgbWFuYWdlci4gTW9zdCBob3N0aW5nIHBsYXRmb3JtcyBhbmQgc2VydmVyIGVudmlyb25tZW50cyBzdXBwb3J0IHRoaXMgd2l0aG91dCBtdWNoIHNldHVwLjwvcD4NCg0KPHByZT48Y29kZT4jIEV4YW1wbGUgb2YgcmVhZGluZyBBUEkgY3JlZGVudGlhbHMgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMNCmltcG9ydCBvcw0KYXBpX2tleSA9IG9zLmVudmlyb24uZ2V0KCdTVFJJUEVfQVBJX0tFWScpDQpwYXltZW50X2ludGVudCA9IHN0cmlwZS5QYXltZW50SW50ZW50LmNyZWF0ZSgNCiAgICBhbW91bnQ9MjAwMCwNCiAgICBjdXJyZW5jeT0nZ2JwJywNCiAgICBhcGlfa2V5PWFwaV9rZXkNCik8L2NvZGU+PC9wcmU+DQoNCjxoMz5JZ25vcmluZyByYXRlIGxpbWl0czwvaDM+DQoNCjxwPkFQSSBwcm92aWRlcnMgaW1wb3NlIHJhdGUgbGltaXRzIHRvIHByZXZlbnQgYWJ1c2UgYW5kIGVuc3VyZSBmYWlyIHJlc291cmNlIHVzYWdlLiBBIHNjcmlwdCB0aGF0IGhpdHMgdGhlIGxpbWl0IHJlcGVhdGVkbHkgbWF5IGJlIGJsb2NrZWQgdGVtcG9yYXJpbHkgb3IgaGF2ZSBpdHMgYWNjZXNzIHJldm9rZWQuIERlc2lnbmluZyBpbnRlZ3JhdGlvbnMgd2l0aCBiYXRjaGluZyBhbmQgYmFja29mZiBsb2dpYyByZXNwZWN0cyB0aGUgbGltaXRzIGFuZCBwcmV2ZW50cyBzZXJ2aWNlIGRpc3J1cHRpb25zLjwvcD4NCg0KPGgzPk5vIGVycm9yIGxvZ2dpbmcgb3IgbW9uaXRvcmluZzwvaDM+DQoNCjxwPldoZW4gYW4gaW50ZWdyYXRpb24gZmFpbHMsIHlvdXIgYnVzaW5lc3MgbmVlZHMgdG8ga25vdy4gV2l0aG91dCBsb2dnaW5nLCBmYWlsdXJlcyBhcmUgaW52aXNpYmxlIHVudGlsIGEgY3VzdG9tZXIgcmVwb3J0cyBhIG1pc3Npbmcgb3JkZXIgb3IgYSBmYWlsZWQgcGF5bWVudC4gU3RydWN0dXJlZCBlcnJvciBsb2dzIHRoYXQgcmVjb3JkIHdoYXQgd2FzIGF0dGVtcHRlZCwgd2hhdCB3ZW50IHdyb25nLCBhbmQgd2hlbiBpdCBoYXBwZW5lZCBtYWtlIGRlYnVnZ2luZyBmYXN0ZXIgYW5kIHJlZHVjZSB0aGUgdGltZSBiZXR3ZWVuIGZhaWx1cmUgYW5kIGZpeC48L3A+DQoNCjxoMz5CdWlsZGluZyB0b28gbXVjaCBiZWZvcmUgdGVzdGluZzwvaDM+DQoNCjxwPkFuIGludGVncmF0aW9uIHRoYXQgd29ya3MgaW4gYSBjb250cm9sbGVkIHRlc3QgZW52aXJvbm1lbnQgYnV0IGZhaWxzIGluIHByb2R1Y3Rpb24gaXMgY29tbW9uIHdoZW4gdGhlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgaGFzIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucywgbmV0d29yayByZXN0cmljdGlvbnMsIG9yIGRhdGEgZm9ybWF0cy4gVGVzdGluZyBpbmNyZW1lbnRhbGx5LCBhdCBlYWNoIHN0ZXAsIGF2b2lkcyB0aGlzIHByb2JsZW0uIFN0YXJ0IHdpdGggYSBtaW5pbWFsIHZlcnNpb24gdGhhdCBoYW5kbGVzIHRoZSBiYXNpYyBjYXNlLCB2ZXJpZnkgaXQgd29ya3MsIHRoZW4gYWRkIGNvbXBsZXhpdHkuPC9wPg0KDQo8aDM+Tm90IHBsYW5uaW5nIGZvciBmdXR1cmUgQVBJIGNoYW5nZXM8L2gzPg0KDQo8cD5JbnRlZ3JhdGlvbnMgdGhhdCB3b3JrIHRvZGF5IG1heSBicmVhayB3aGVuIHRoZSBBUEkgcHJvdmlkZXIgdXBkYXRlcyB0aGVpciBzZXJ2aWNlLiBXcmFwcGluZyBBUEkgY2FsbHMgaW4gZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVwZGF0ZWQgY2VudHJhbGx5IGlzb2xhdGVzIHRoZSBpbnRlZ3JhdGlvbiBmcm9tIGNoYW5nZXMuIFRoaXMgYXBwcm9hY2ggbWVhbnMgdXBkYXRpbmcgb25lIGZ1bmN0aW9uIHdoZW4gYW4gQVBJIGNoYW5nZXMgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRocm91Z2ggbXVsdGlwbGUgcGxhY2VzIGluIHlvdXIgY29kZS48L3A+DQoNCjxoMj5XaGVuIHRvIGJ1aWxkIGludGVncmF0aW9ucyB5b3Vyc2VsZiBhbmQgd2hlbiB0byBoaXJlIGhlbHA8L2gyPg0KDQo8cD5TbWFsbCBidXNpbmVzc2VzIHdpdGggaW4taG91c2UgdGVjaG5pY2FsIGNhcGFiaWxpdHkgY2FuIGhhbmRsZSBzdHJhaWdodGZvcndhcmQgaW50ZWdyYXRpb25zLiBDb25uZWN0aW5nIGEgZm9ybSB0byBhbiBlbWFpbCBwbGF0Zm9ybSB1c2luZyBhIHBsdWdpbiBvciBuYXRpdmUgaW50ZWdyYXRpb24sIHN5bmNpbmcgYSBjYWxlbmRhciB3aXRoIGEgYm9va2luZyB0b29sIHVzaW5nIHN0YW5kYXJkIGRvY3VtZW50YXRpb24sIG9yIHNldHRpbmcgdXAgYSBwYXltZW50IHByb2Nlc3NvciB3aXRoIGEgY29tbW9uIHBsYXRmb3JtIG9mdGVuIGZhbGxzIHdpdGhpbiByZWFjaCBpZiB5b3UgYXJlIGNvbWZvcnRhYmxlIHdpdGggYmFzaWMgY29uZmlndXJhdGlvbi48L3A+DQoNCjxwPk1vcmUgY29tcGxleCBpbnRlZ3JhdGlvbnMgdXN1YWxseSBiZW5lZml0IGZyb20gcHJvZmVzc2lvbmFsIGhlbHAuIFNpdHVhdGlvbnMgdGhhdCB0eXBpY2FsbHkgd2FycmFudCBicmluZ2luZyBpbiBhbiBJVCBzcGVjaWFsaXN0IG9yIHdlYiBkZXZlbG9wZXI6PC9wPg0KDQo8dWw+DQogIDxsaT5JbnRlZ3JhdGlvbnMgaW52b2x2aW5nIG11bHRpcGxlIHN5c3RlbXMgdGhhdCBuZWVkIHRvIHN0YXkgcmVsaWFibHkgaW4gc3luYyBhY3Jvc3MgZGlmZmVyZW50IHBsYXRmb3Jtcy48L2xpPg0KICA8bGk+Q3VzdG9tIHdvcmtmbG93cyB0aGF0IHJlcXVpcmUgbG9naWMgYmV5b25kIHNpbXBsZSBkYXRhIHRyYW5zZmVyLCBzdWNoIGFzIGNvbmRpdGlvbmFsIGFjdGlvbnMsIG11bHRpLXN0ZXAgcHJvY2Vzc2VzLCBvciBidXNpbmVzcyBydWxlcyB0aGF0IGNoYW5nZSBiYXNlZCBvbiB0aGUgZGF0YS48L2xpPg0KICA8bGk+SW50ZWdyYXRpb25zIGhhbmRsaW5nIHNlbnNpdGl2ZSBkYXRhIHN1Y2ggYXMgcGF5bWVudCBpbmZvcm1hdGlvbiBvciBwZXJzb25hbCBjdXN0b21lciBkZXRhaWxzLCB3aGVyZSBtaXN0YWtlcyBoYXZlIGNvbXBsaWFuY2Ugb3IgcmVwdXRhdGlvbmFsIGNvbnNlcXVlbmNlcy48L2xpPg0KICA8bGk+TG9uZy1ydW5uaW5nIGF1dG9tYXRpb24gdGhhdCBuZWVkcyBtb25pdG9yaW5nIGFuZCBtYWludGVuYW5jZSBwbGFubmluZyBidWlsdCBpbiBmcm9tIHRoZSBzdGFydC48L2xpPg0KICA8bGk+U2l0dWF0aW9ucyB3aGVyZSB0aGUgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZG9lcyBub3QgY292ZXIgdGhlIHNwZWNpZmljIHVzZSBjYXNlIGFuZCByZXNlYXJjaCBvciBleHBlcmltZW50YXRpb24gaXMgcmVxdWlyZWQgdG8gZmluZCBhIHdvcmtpbmcgYXBwcm9hY2guPC9saT4NCjwvdWw+DQoNCjxwPkZvciBhIFVLIHNtYWxsIGJ1c2luZXNzLCB0aGUgY29zdCBvZiBhbiBpbnRlZ3JhdGlvbiBidWlsdCBieSBhbiBJVCBzcGVjaWFsaXN0IGlzIHVzdWFsbHkganVzdGlmaWVkIHdoZW4gdGhlIGFsdGVybmF0aXZlIGlzIG9uZ29pbmcgbWFudWFsIHdvcmssIHBlcnNpc3RlbnQgZGF0YSBlcnJvcnMsIG9yIHRoZSByaXNrIG9mIGFuIHVuZGV0ZWN0ZWQgZmFpbHVyZSBhZmZlY3RpbmcgY3VzdG9tZXJzIG9yIGNhdXNpbmcgY29tcGxpYW5jZSBpc3N1ZXMuPC9wPg0KDQo8aDI+TWFpbnRhaW5pbmcgaW50ZWdyYXRpb25zIG92ZXIgdGltZTwvaDI+DQoNCjxwPkFuIGludGVncmF0aW9uIGlzIG5vdCBhIG9uZS10aW1lIGJ1aWxkLiBJdCBuZWVkcyBvY2Nhc2lvbmFsIGF0dGVudGlvbiB0byBzdGF5IGZ1bmN0aW9uYWwuIEEgcHJhY3RpY2FsIG1haW50ZW5hbmNlIHJvdXRpbmUgaW5jbHVkZXM6PC9wPg0KDQo8dWw+DQogIDxsaT48c3Ryb25nPlBlcmlvZGljIGNoZWNrczo8L3N0cm9uZz4gUmV2aWV3IGludGVncmF0aW9uIGxvZ3MgbW9udGhseSB0byBjYXRjaCBlcnJvcnMgdGhhdCBvY2N1cnJlZCB3aXRob3V0IGN1c3RvbWVyIGNvbXBsYWludHMuIEEgbG9nIGVudHJ5IHNob3dpbmcgcmVwZWF0ZWQgZmFpbHVyZXMgdGhhdCBub2JvZHkgbm90aWNlZCBpcyBlYXNpZXIgdG8gZml4IGJlZm9yZSBpdCBhZmZlY3RzIG1vcmUgcmVjb3Jkcy48L2xpPg0KICA8bGk+PHN0cm9uZz5BUEkgY2hhbmdlbG9nIHJldmlldzo8L3N0cm9uZz4gV2hlbiBhIHByb3ZpZGVyIGFubm91bmNlcyBjaGFuZ2VzIHRvIHRoZWlyIEFQSSwgYXNzZXNzIHdoZXRoZXIgeW91ciBpbnRlZ3JhdGlvbiBpcyBhZmZlY3RlZCBhbmQgc2NoZWR1bGUgdGltZSB0byB1cGRhdGUgaXQgYmVmb3JlIHRoZSBjaGFuZ2UgdGFrZXMgZWZmZWN0LjwvbGk+DQogIDxsaT48c3Ryb25nPkNyZWRlbnRpYWwgcm90YXRpb246PC9zdHJvbmc+IElmIEFQSSBrZXlzIG9yIHRva2VucyBhcmUgc2hhcmVkIGFjcm9zcyBpbnRlZ3JhdGlvbnMsIHJvdGF0ZSB0aGVtIHBlcmlvZGljYWxseSBhbmQgdXBkYXRlIHRoZSByZWxldmFudCBpbnRlZ3JhdGlvbiBzZXR0aW5ncyBhY2NvcmRpbmdseS48L2xpPg0KICA8bGk+PHN0cm9uZz5GYWlsdXJlIGFsZXJ0IHRlc3Rpbmc6PC9zdHJvbmc+IE9jY2FzaW9uYWxseSB0cmlnZ2VyIGEgdGVzdCBmYWlsdXJl