Qubit Procedure (Standard HS DNA protocol)

Plate Reader Procedure

Prepare the first standard Combine 20uL of 100ug/mL lambda DNA from the Quant-IT PicoGreen dsDNA assay kit (Fisher P7589) with 980uL 1X TE to create a 2ug/mL standard.
This is Standard 1 which will have a final concentration of 1 ug/mL

Prepare the 200 fold dilution of pico dye to be kept in the dark

Prepare the rest of the standards

  1. Combine 10uL of Standard 1 with 990uL 1X TE. This is standard 2 with a final concentration of 0.1 ug/mL.

  2. Combine 1uL of Standard 1 with 999uL 1X TE. This is standard 3 with a final concentration of 0.01 ng/mL.

  3. Add 1000uL 1X TE to a new tube. This is standard 4 with a concentration of 0 ug/mL.

Prep a standards plate
Place 100uL of each standard in separate wells on a separate plate for standards only.

Prepare the samples and load the plates

  1. Add 99uL 1xTE to all of the sample wells of the sample plates.

  2. Add 100uL of standards to the standards plate.

  3. Add 1uL of each sample to each sample well of sample plates.

  4. Add 100ul pico dilution to every well that contains either a standard or a sample, pipet up and down to mix.

  5. Incubate at room temperature for at least 5 minutes in the dark (MRS stacks the plates one on top of the other and then puts foil seal tape on the top plate).

Read the plates on the plate reader

  1. Turn on the SpectraMax plate reader.

  2. Open the SoftMax Pro (v. 6.4) software

  3. Click open > Documents > Michelle > pico.sda

  4. Adjust the number of plates to match this batch including the standards plate (the last plate should be the standards plate).

    • For plates containing samples, select the plate, click on the template editor, highlight all of the wells, click Unknowns from the window pane on the right, click on the series button in the bottom pane, make sure “top to bottom” is selected, make sure it is 1 x by 1 y, and the dilution factor should be set to 200 / 1.
    • The last plate should be the standards plate, the value of these standards is the qubit value divided by 2 (because you used 100ul of the standard and 100ul of the pico dye mix, diluting the standard in half.)

    • For any empty wells or wells you don’t want to read, select “plate blank”

  5. Click on the first plate (corresponding to your plate 1), and click read.

    • If “read” is not available, make sure the spectramax is connected to the software (left most button) and that you have selected the plate.
  6. Once the plate has been read and the drawer opens, put in the next plate, click on the corresponding plate number in the software, and click read.

  7. Once the standard plate has been read, double check the expected values of the standards and the calculated values of the standards. Double check the standard curve. Does it all look good or are the values way off? Remove standards that don’t fit the curve and consider re-doing the entire plate run if the standards don’t line up well. Hopefully everything jives.

  8. Once all of the plates have been read, click on the blue plate icon in the top left and click “save as” and save as the “date_full” to indicate that the report contains all of the plates for that day. This is an sda file that can only be opened in the softmax pro software but is helpful for checking machine settings or recreating what you did.

  9. Click the blue plate icon again and select “export”, check the “unknowns” box, and save as the same name as in step 6. This is a text file that contains the data you will import into the database.

Copy of protocol from plate reader:

Quantitation of double-stranded DNA using Quant-iT PicoGreen Reagent Invitrogen (Molecular Probes)

MATERIALS

  • Quant-iT PicoGreen dsDNA Assay Kit, including lambda DNA standard (Invitrogen cat. #P7589 or P11496)
  • Black 96-well plate (Greiner Bio-One, cat. # 655096)
  • Brown or amber (light-blocking) microcentrifuge tubes

METHODS

Set up the protocol:

  • Select Wells to Read and Assay Plate Type by clicking on “Settings” and locating the options on the left side of the screen.

  • Click the Template button to open a window where you can assign wells of the microplate to pre-set template groups using the drop-down menu to select the appropriate template group. There are preconfigured template groups in the PicoGreen Fluorescence protocol including Standards, Unknowns, and Unknowns_NoDiln (for undiluted samples). Assigning wells to pre-set template groups populates group tables in the protocol with the corresponding data acquired when the microplate is read.

Prepare the assay

The method for this assay follows the instructions in the product information sheet for Quant-iT PicoGreen dsDNA Reagent and Kits from Molecular Probes, except that the assay volume is proportionately reduced from 2.0 mL to 200 uL to fit a 96-well microplate format.

  • Prepare 1X TE buffer (10 mM Tris-HCl, 1 mM EDTA, pH 7.5) by diluting the concentrated buffer from the kit 20-fold with distilled DNase-free water, as required by Molecular Probes.
  • Prepare an aqueous working solution of Quant-iT PicoGreen reagent by making a 200-fold dilution of the concentrated DMSO solution in TE buffer (prepared above). Preparation of the solution in a plastic container, rather than glass, is recommended, as the reagent may adsorb to glass surfaces. Protect the solution from light by using amber or brown tubes, or by covering with foil. This solution should be used within a few hours of its preparation.
  • DNA standard curve: Prepare a 2 µg/mL stock solution of dsDNA in TE. The lambda DNA standard provided with the kit can be diluted 50-fold in TE to make the 2 µg/mL solution. Note: in some cases it may be preferable to make the standard curve using DNA similar to the type being assayed.
  • A high-range standard curve may be prepared from 1 ng/mL to 1 µg/mL, or a low-range standard curve may be prepared from 25 pg/mL to 25 ng/mL. For the high-range curve, follow the dilution scheme shown in the PicoGreen product insert; for the low-range curve, dilute the 2 µg/mL solution 40-fold to yield a 50 ng/mL solution, and refer to the alternative dilution scheme in the product insert.
  • Pipet standards into a solid black 96-well microplate at 100 µL per well, preferably in triplicate. Be sure to include a set of buffer blank wells containing TE only (no DNA).
  • Add 100 µL of the aqueous working solution of Quant-iT PicoGreen reagent to each well. Mix well by trituration or plate shaker and incubate for 2 to 5 minutes at room temperature, protected from light.

Read the microplate

  • Make sure the purple plate adapter is in the microplate reader drawer. Place the microplate in the drawer.
  • Click the Read button in the SoftMax Pro software. The instrument will read the plate and the relative fluorescence units will be displayed in the Plate section of the protocol.

Analyze the data

  • After the microplate has been read, the relative fluorescence units (RFUs) will be displayed in the Plate section. The data will be analyzed in the Group Tables that were created when the template was set up.
  • Standards assigned in the Template (and thus displayed in the Standards group table) will be automatically plotted in the Standard Curve section of the protocol. A linear curve fit is applied by default, but a log-log fit may be used when plotting a standard curve over a wide dynamic range. Curve fits are chosen from the drop-down Curve Fit menu in the graph section’s tool bar.

Import the data from the plate reader to the database

Once you have completed all of the steps in the quant_prep.pdf, it is time to import the data into the database and make a note for your lab notebook

Read in quantification results

  1. Open the plate reader results file and pull in the data

For this round only opening the txt file in excel and changing the names of the samples that are in sample numbers higher than the test samples in the standards plate.

  1. Connect names of samples from database

Double check that the number of rows for each plate is what is expected

Write these changes into the database

LS0tCnRpdGxlOiAiRE5BIFF1YW50aWZpY2F0aW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKcGFyYW1zOgogIG51bV9zYW1wbGVzOiAxNjAKICBudW1fc3RkczogOAotLS0KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCmBgYHtyfQppZihwYXJhbXMkbnVtX3NhbXBsZXMgPCAyMCl7CnF1YW50IDwtIHRyaWJibGUofml0ZW0sIH5xdWFudGl0eSwgCiAgICAgICAgICAgICAgICAgInF1Yml0X3R1YmVzIiwgcGFyYW1zJG51bV9zYW1wbGVzICsgMiwKICAgICAgICAgICAgICAgICAicXViaXRfZHllX3VsIiwgcGFyYW1zJG51bV9zYW1wbGVzICsgMiwKICAgICAgICAgICAgICAgICAicXViaXRfYnVmZmVyX3VsIiwgMTk5ICogKHBhcmFtcyRudW1fc2FtcGxlcyArIDIpLAogICAgICAgICAgICAgICAgICJxdWJpdF9zdGQxX3VsIiwgMTAsCiAgICAgICAgICAgICAgICAgInF1Yml0X3N0ZDJfdWwiLCAxMCwgCiAgICAgICAgICAgICAgICAgInRpcHNfMTAiLCBwYXJhbXMkbnVtX3NhbXBsZXMgKyAyLAogICAgICAgICAgICAgICAgICJ0aXBzXzEwMCIsIDEsCiAgICAgICAgICAgICAgICAgInRpcHNfMTAwMCIsIDIsCiAgICAgICAgICAgICAgICAgInR1YmVzXzEuN21sIiwgMSkKfWVsc2V7CnF1YW50IDwtIHRyaWJibGUofml0ZW0sIH5xdWFudGl0eSwKICAgICAgICAgICAgICAgICAidHViZXNfMS43bWwiLCA0LCAKICAgICAgICAgICAgICAgICAiMXhfdGVfYnVmZmVyX3VsIiwgOTgwICsgKHBhcmFtcyRudW1fc2FtcGxlcyArIHBhcmFtcyRudW1fc3RkcykqMTAwLAogICAgICAgICAgICAgICAgICIxMDBfdWcvbWxfbGFtYmRhX2RuYV91bCIsIDIwLAogICAgICAgICAgICAgICAgICJwaWNvX3VsIiwgKHBhcmFtcyRudW1fc2FtcGxlcyArIHBhcmFtcyRudW1fc3RkcykqMTAwLzIwMCwgCiAgICAgICAgICAgICAgICAgImdyZW5pZXJfcGxhdGVzIiwgY2VpbGluZygocGFyYW1zJG51bV9zYW1wbGVzICsgcGFyYW1zJG51bV9zdGRzKS85NiksIAogICAgICAgICAgICAgICAgICJ0aXBzXzEwMCIsMyArIChwYXJhbXMkbnVtX3NhbXBsZXMgKiAyKSArIHBhcmFtcyRudW1fc3RkcywKICAgICAgICAgICAgICAgICAidGlwc18xMCIsIDIgKyBwYXJhbXMkbnVtX3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgInRpcHNfMTAwMCIsNCkKfQpgYGAKCiMjIFF1Yml0IFByb2NlZHVyZSAoU3RhbmRhcmQgSFMgRE5BIHByb3RvY29sKQotIFNldCB1cCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIDAuNS1tTCB0dWJlcyBmb3Igc3RhbmRhcmRzIGFuZCBzYW1wbGVzLiBUaGUgUXViaXTCriBSTkEgSFMgQXNzYXkgcmVxdWlyZXMgMiBzdGFuZGFyZHMuCi0gTGFiZWwgdGhlIHR1YmUgbGlkcy4KLSBQcmVwYXJlIHRoZSBRdWJpdMKuIHdvcmtpbmcgc29sdXRpb24gYnkgZGlsdXRpbmcgdGhlIFF1Yml0wq4gRE5BIEhTIFJlYWdlbnQgMToyMDAgaW4gUXViaXTCriBETkEgSFMgQnVmZmVyLiBVc2UgYSBjbGVhbiBwbGFzdGljIHR1YmUgZWFjaCB0aW1lIHlvdSBwcmVwYXJlIFF1Yml0wq4gd29ya2luZyBzb2x1dGlvbi4gKipEbyBub3QgbWl4IHRoZSB3b3JraW5nIHNvbHV0aW9uIGluIGEgZ2xhc3MgY29udGFpbmVyLioqCi0gQWRkIDE5MCDOvEwgb2YgUXViaXTCriB3b3JraW5nIHNvbHV0aW9uIHRvIGVhY2ggb2YgdGhlIHR1YmVzIHVzZWQgZm9yIHN0YW5kYXJkcy4KLSBBZGQgMTAgzrxMIG9mIGVhY2ggUXViaXTCriBzdGFuZGFyZCB0byB0aGUgYXBwcm9wcmlhdGUgdHViZSwgdGhlbiBtaXggYnkgdm9ydGV4aW5nIDLigJMzIHNlY29uZHMuIEJlIGNhcmVmdWwgbm90IHRvIGNyZWF0ZSBidWJibGVzLgotIEFkZCBRdWJpdMKuIHdvcmtpbmcgc29sdXRpb24gdG8gaW5kaXZpZHVhbCBhc3NheSB0dWJlcyBzbyB0aGF0IHRoZSBmaW5hbCB2b2x1bWUgaW4gZWFjaCB0dWJlIGFmdGVyIGFkZGluZyBzYW1wbGUgaXMgMjAwIM68TC4KLSBBZGQgZWFjaCBzYW1wbGUgdG8gdGhlIGFzc2F5IHR1YmVzIGNvbnRhaW5pbmcgdGhlIGNvcnJlY3Qgdm9sdW1lIG9mIFF1Yml0wq4gd29ya2luZyBzb2x1dGlvbiwgdGhlbiBtaXggYnkgdm9ydGV4aW5nIDLigJMzIHNlY29uZHMuIFRoZSBmaW5hbCB2b2x1bWUgaW4gZWFjaCB0dWJlIHNob3VsZCBiZSAyMDAgzrxMLgotIEFsbG93IGFsbCB0dWJlcyB0byBpbmN1YmF0ZSBhdCByb29tIHRlbXBlcmF0dXJlIGZvciAyIG1pbnV0ZXMuCi0gT24gdGhlIEhvbWUgc2NyZWVuIG9mIHRoZSBRdWJpdMKuIDMuMCBGbHVvcm9tZXRlciwgcHJlc3MgRE5BLCB0aGVuIHNlbGVjdCBETkE6IEhpZ2ggU2Vuc2l0aXZpdHkgYXMgdGhlIGFzc2F5IHR5cGUuIFRoZSDigJxSZWFkIHN0YW5kYXJkc+KAnSBzY3JlZW4gaXMgZGlzcGxheWVkLiBQcmVzcyBSZWFkIFN0YW5kYXJkcyB0byBwcm9jZWVkLgotIEluc2VydCB0aGUgdHViZSBjb250YWluaW5nIFN0YW5kYXJkICMxIGludG8gdGhlIHNhbXBsZSBjaGFtYmVyLCBjbG9zZSB0aGUgbGlkLCB0aGVuIHByZXNzIFJlYWQgc3RhbmRhcmQuIFdoZW4gdGhlIHJlYWRpbmcgaXMgY29tcGxldGUgKH4zIHNlY29uZHMpLCByZW1vdmUgU3RhbmRhcmQgIzEuCi0gSW5zZXJ0IHRoZSB0dWJlIGNvbnRhaW5pbmcgU3RhbmRhcmQgIzIgaW50byB0aGUgc2FtcGxlIGNoYW1iZXIsIGNsb3NlIHRoZSBsaWQsIHRoZW4gcHJlc3MgUmVhZCBzdGFuZGFyZC4gV2hlbiB0aGUgcmVhZGluZyBpcyBjb21wbGV0ZSwgcmVtb3ZlIFN0YW5kYXJkICMyLgotIFByZXNzIFJ1biBzYW1wbGVzLgotIE9uIHRoZSBhc3NheSBzY3JlZW4sIHNlbGVjdCB0aGUgc2FtcGxlIHZvbHVtZSBhbmQgdW5pdHMKLSBJbnNlcnQgYSBzYW1wbGUgdHViZSBpbnRvIHRoZSBzYW1wbGUgY2hhbWJlciwgY2xvc2UgdGhlIGxpZCwgdGhlbiBwcmVzcyBSZWFkIHR1YmUuIFdoZW4gdGhlIHJlYWRpbmcgaXMgY29tcGxldGUgKH4zIHNlY29uZHMpLCByZW1vdmUgdGhlIHNhbXBsZSB0dWJlLgotIFJlcGVhdCBzdGVwIGxhc3Qgc3RlcCB1bnRpbCBhbGwgc2FtcGxlcyBoYXZlIGJlZW4gcmVhZAoKIyMgUGxhdGUgUmVhZGVyIFByb2NlZHVyZQoqKlByZXBhcmUgdGhlIGZpcnN0IHN0YW5kYXJkKioKQ29tYmluZSAyMHVMIG9mIDEwMHVnL21MIGxhbWJkYSBETkEgZnJvbSB0aGUgUXVhbnQtSVQgUGljb0dyZWVuIGRzRE5BIGFzc2F5IGtpdCAoRmlzaGVyIFA3NTg5KSB3aXRoIDk4MHVMIDFYIFRFIHRvIGNyZWF0ZSBhIDJ1Zy9tTCBzdGFuZGFyZC4gIApUaGlzIGlzIFN0YW5kYXJkIDEgd2hpY2ggd2lsbCBoYXZlIGEgZmluYWwgY29uY2VudHJhdGlvbiBvZiAxIHVnL21MCgoqKlByZXBhcmUgdGhlIDIwMCBmb2xkIGRpbHV0aW9uIG9mIHBpY28gZHllIHRvIGJlIGtlcHQgaW4gdGhlIGRhcmsqKiAgCgpgYGB7ciBldmFsPUZBTFNFfQpmaW5hbF92b2wgPC0gcGFyYW1zJG51bV9wbGF0ZXMqOTYqMS4xKjIwMC8yCmBgYAogCjwhLS0gQ29tYmluZSBgciAjZmluYWxfdm9sLzIwMGB1TCBwaWNvIGNvbmNlbnRyYXRlIHdpdGggYHIgI2ZpbmFsX3ZvbC8xMDAwYG1MIDFYIFRFLiAgIC0tPgoKKipQcmVwYXJlIHRoZSByZXN0IG9mIHRoZSBzdGFuZGFyZHMqKiAgCgoxLiBDb21iaW5lIDEwdUwgb2YgU3RhbmRhcmQgMSB3aXRoIDk5MHVMIDFYIFRFLiAgVGhpcyBpcyBzdGFuZGFyZCAyIHdpdGggYSBmaW5hbCBjb25jZW50cmF0aW9uIG9mIDAuMSB1Zy9tTC4gIAoKMS4gQ29tYmluZSAxdUwgb2YgU3RhbmRhcmQgMSB3aXRoIDk5OXVMIDFYIFRFLiBUaGlzIGlzIHN0YW5kYXJkIDMgd2l0aCBhIGZpbmFsIGNvbmNlbnRyYXRpb24gb2YgMC4wMSBuZy9tTC4gIAoKMS4gQWRkIDEwMDB1TCAxWCBURSB0byBhIG5ldyB0dWJlLiBUaGlzIGlzIHN0YW5kYXJkIDQgd2l0aCBhIGNvbmNlbnRyYXRpb24gb2YgMCB1Zy9tTC4gIAoKKipQcmVwIGEgc3RhbmRhcmRzIHBsYXRlICoqICAKUGxhY2UgMTAwdUwgb2YgZWFjaCBzdGFuZGFyZCBpbiBzZXBhcmF0ZSB3ZWxscyBvbiBhIHNlcGFyYXRlIHBsYXRlIGZvciBzdGFuZGFyZHMgb25seS4KCgoqKlByZXBhcmUgdGhlIHNhbXBsZXMgYW5kIGxvYWQgdGhlIHBsYXRlcyoqICAKCjEuIEFkZCA5OXVMIDF4VEUgdG8gYWxsIG9mIHRoZSBzYW1wbGUgd2VsbHMgb2YgdGhlIHNhbXBsZSBwbGF0ZXMuIAoKMS4gQWRkIDEwMHVMIG9mIHN0YW5kYXJkcyB0byB0aGUgc3RhbmRhcmRzIHBsYXRlLiAgCgoxLiBBZGQgMXVMIG9mIGVhY2ggc2FtcGxlIHRvIGVhY2ggc2FtcGxlIHdlbGwgb2Ygc2FtcGxlIHBsYXRlcy4gIAoKMS4gQWRkIDEwMHVsIHBpY28gZGlsdXRpb24gdG8gZXZlcnkgd2VsbCB0aGF0IGNvbnRhaW5zIGVpdGhlciBhIHN0YW5kYXJkIG9yIGEgc2FtcGxlLCBwaXBldCB1cCBhbmQgZG93biB0byBtaXguICAKCjEuIEluY3ViYXRlIGF0IHJvb20gdGVtcGVyYXR1cmUgZm9yIGF0IGxlYXN0IDUgbWludXRlcyBpbiB0aGUgZGFyayAoTVJTIHN0YWNrcyB0aGUgcGxhdGVzIG9uZSBvbiB0b3Agb2YgdGhlIG90aGVyIGFuZCB0aGVuIHB1dHMgZm9pbCBzZWFsIHRhcGUgb24gdGhlIHRvcCBwbGF0ZSkuICAKCgoqKlJlYWQgdGhlIHBsYXRlcyBvbiB0aGUgcGxhdGUgcmVhZGVyKiogIAoKMS4gVHVybiBvbiB0aGUgU3BlY3RyYU1heCBwbGF0ZSByZWFkZXIuICAKCjIuIE9wZW4gdGhlIFNvZnRNYXggUHJvICh2LiA2LjQpIHNvZnR3YXJlICAKCjIuIENsaWNrIG9wZW4gPiBEb2N1bWVudHMgPiBNaWNoZWxsZSA+IHBpY28uc2RhICAKCjMuIEFkanVzdCB0aGUgbnVtYmVyIG9mIHBsYXRlcyB0byBtYXRjaCB0aGlzIGJhdGNoIGluY2x1ZGluZyB0aGUgc3RhbmRhcmRzIHBsYXRlICh0aGUgbGFzdCBwbGF0ZSBzaG91bGQgYmUgdGhlIHN0YW5kYXJkcyBwbGF0ZSkuICAKCiAgICAtIEZvciBwbGF0ZXMgY29udGFpbmluZyBzYW1wbGVzLCBzZWxlY3QgdGhlIHBsYXRlLCBjbGljayBvbiB0aGUgdGVtcGxhdGUgZWRpdG9yLCBoaWdobGlnaHQgYWxsIG9mIHRoZSB3ZWxscywgY2xpY2sgVW5rbm93bnMgZnJvbSB0aGUgd2luZG93IHBhbmUgb24gdGhlIHJpZ2h0LCBjbGljayBvbiB0aGUgc2VyaWVzIGJ1dHRvbiBpbiB0aGUgYm90dG9tIHBhbmUsIG1ha2Ugc3VyZSAidG9wIHRvIGJvdHRvbSIgaXMgc2VsZWN0ZWQsIG1ha2Ugc3VyZSBpdCBpcyAxIHggYnkgMSB5LCBhbmQgdGhlIGRpbHV0aW9uIGZhY3RvciBzaG91bGQgYmUgc2V0IHRvIDIwMCAvIDEuICAKICAgIC0gVGhlIGxhc3QgcGxhdGUgc2hvdWxkIGJlIHRoZSBzdGFuZGFyZHMgcGxhdGUsIHRoZSB2YWx1ZSBvZiB0aGVzZSBzdGFuZGFyZHMgaXMgdGhlIHF1Yml0IHZhbHVlIGRpdmlkZWQgYnkgMiAoYmVjYXVzZSB5b3UgdXNlZCAxMDB1bCBvZiB0aGUgc3RhbmRhcmQgYW5kIDEwMHVsIG9mIHRoZSBwaWNvIGR5ZSBtaXgsIGRpbHV0aW5nIHRoZSBzdGFuZGFyZCBpbiBoYWxmLikgIAoKICAgIC0gRm9yIGFueSBlbXB0eSB3ZWxscyBvciB3ZWxscyB5b3UgZG9uJ3Qgd2FudCB0byByZWFkLCBzZWxlY3QgInBsYXRlIGJsYW5rIiAKCjUuIENsaWNrIG9uIHRoZSBmaXJzdCBwbGF0ZSAoY29ycmVzcG9uZGluZyB0byB5b3VyIHBsYXRlIDEpLCBhbmQgY2xpY2sgcmVhZC4gIAoKICAgIC0gSWYgInJlYWQiIGlzIG5vdCBhdmFpbGFibGUsIG1ha2Ugc3VyZSB0aGUgc3BlY3RyYW1heCBpcyBjb25uZWN0ZWQgdG8gdGhlIHNvZnR3YXJlIChsZWZ0IG1vc3QgYnV0dG9uKSBhbmQgdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCB0aGUgcGxhdGUuICAKCjUuIE9uY2UgdGhlIHBsYXRlIGhhcyBiZWVuIHJlYWQgYW5kIHRoZSBkcmF3ZXIgb3BlbnMsIHB1dCBpbiB0aGUgbmV4dCBwbGF0ZSwgY2xpY2sgb24gdGhlIGNvcnJlc3BvbmRpbmcgcGxhdGUgbnVtYmVyIGluIHRoZSBzb2Z0d2FyZSwgYW5kIGNsaWNrIHJlYWQuICAKCjYuIE9uY2UgdGhlIHN0YW5kYXJkIHBsYXRlIGhhcyBiZWVuIHJlYWQsIGRvdWJsZSBjaGVjayB0aGUgZXhwZWN0ZWQgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZHMgYW5kIHRoZSBjYWxjdWxhdGVkIHZhbHVlcyBvZiB0aGUgc3RhbmRhcmRzLiAgRG91YmxlIGNoZWNrIHRoZSBzdGFuZGFyZCBjdXJ2ZS4gIERvZXMgaXQgYWxsIGxvb2sgZ29vZCBvciBhcmUgdGhlIHZhbHVlcyB3YXkgb2ZmPyAgUmVtb3ZlIHN0YW5kYXJkcyB0aGF0IGRvbid0IGZpdCB0aGUgY3VydmUgYW5kIGNvbnNpZGVyIHJlLWRvaW5nIHRoZSBlbnRpcmUgcGxhdGUgcnVuIGlmIHRoZSBzdGFuZGFyZHMgZG9uJ3QgbGluZSB1cCB3ZWxsLiAgSG9wZWZ1bGx5IGV2ZXJ5dGhpbmcgaml2ZXMuICAKCjYuIE9uY2UgYWxsIG9mIHRoZSBwbGF0ZXMgaGF2ZSBiZWVuIHJlYWQsIGNsaWNrIG9uIHRoZSBibHVlIHBsYXRlIGljb24gaW4gdGhlIHRvcCBsZWZ0IGFuZCBjbGljayAic2F2ZSBhcyIgYW5kIHNhdmUgYXMgdGhlICJkYXRlX2Z1bGwiIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlcG9ydCBjb250YWlucyBhbGwgb2YgdGhlIHBsYXRlcyBmb3IgdGhhdCBkYXkuICBUaGlzIGlzIGFuIHNkYSBmaWxlIHRoYXQgY2FuIG9ubHkgYmUgb3BlbmVkIGluIHRoZSBzb2Z0bWF4IHBybyBzb2Z0d2FyZSBidXQgaXMgaGVscGZ1bCBmb3IgY2hlY2tpbmcgbWFjaGluZSBzZXR0aW5ncyBvciByZWNyZWF0aW5nIHdoYXQgeW91IGRpZC4gIAoKNy4gQ2xpY2sgdGhlIGJsdWUgcGxhdGUgaWNvbiBhZ2FpbiBhbmQgc2VsZWN0ICJleHBvcnQiLCBjaGVjayB0aGUgInVua25vd25zIiBib3gsIGFuZCBzYXZlIGFzIHRoZSBzYW1lIG5hbWUgYXMgaW4gc3RlcCA2LiAgVGhpcyBpcyBhIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHlvdSB3aWxsIGltcG9ydCBpbnRvIHRoZSBkYXRhYmFzZS4KCiMjIyBDb3B5IG9mIHByb3RvY29sIGZyb20gcGxhdGUgcmVhZGVyOgpRdWFudGl0YXRpb24gb2YgZG91YmxlLXN0cmFuZGVkIEROQSB1c2luZyBRdWFudC1pVCBQaWNvR3JlZW4gUmVhZ2VudApJbnZpdHJvZ2VuIChNb2xlY3VsYXIgUHJvYmVzKQoKIyMjIyBNQVRFUklBTFMgIAotIFF1YW50LWlUIFBpY29HcmVlbiBkc0ROQSBBc3NheSBLaXQsIGluY2x1ZGluZyBsYW1iZGEgRE5BIHN0YW5kYXJkIChJbnZpdHJvZ2VuIGNhdC4gI1A3NTg5IG9yICBQMTE0OTYpICAKLSBCbGFjayA5Ni13ZWxsIHBsYXRlIChHcmVpbmVyIEJpby1PbmUsIGNhdC4gIyA2NTUwOTYpICAKLSBCcm93biBvciBhbWJlciAobGlnaHQtYmxvY2tpbmcpIG1pY3JvY2VudHJpZnVnZSB0dWJlcwoKIyMjIyBNRVRIT0RTClNldCB1cCB0aGUgcHJvdG9jb2w6ICAKCi0gU2VsZWN0IFdlbGxzIHRvIFJlYWQgYW5kIEFzc2F5IFBsYXRlIFR5cGUgYnkgY2xpY2tpbmcgb24gIlNldHRpbmdzIiBhbmQgbG9jYXRpbmcgdGhlIG9wdGlvbnMgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuLiAgCgotIENsaWNrIHRoZSBUZW1wbGF0ZSBidXR0b24gdG8gb3BlbiBhIHdpbmRvdyB3aGVyZSB5b3UgY2FuIGFzc2lnbiB3ZWxscyBvZiB0aGUgbWljcm9wbGF0ZSB0byBwcmUtc2V0IHRlbXBsYXRlIGdyb3VwcyB1c2luZyB0aGUgZHJvcC1kb3duIG1lbnUgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBncm91cC4gIFRoZXJlIGFyZSBwcmVjb25maWd1cmVkIHRlbXBsYXRlIGdyb3VwcyBpbiB0aGUgUGljb0dyZWVuIEZsdW9yZXNjZW5jZSBwcm90b2NvbCBpbmNsdWRpbmcgU3RhbmRhcmRzLCBVbmtub3ducywgYW5kIFVua25vd25zX05vRGlsbiAoZm9yIHVuZGlsdXRlZCBzYW1wbGVzKS4gIEFzc2lnbmluZyB3ZWxscyB0byBwcmUtc2V0IHRlbXBsYXRlIGdyb3VwcyBwb3B1bGF0ZXMgZ3JvdXAgdGFibGVzIGluIHRoZSBwcm90b2NvbCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYWNxdWlyZWQgd2hlbiB0aGUgbWljcm9wbGF0ZSBpcyByZWFkLgoKIyMjIyBQcmVwYXJlIHRoZSBhc3NheQpUaGUgbWV0aG9kIGZvciB0aGlzIGFzc2F5IGZvbGxvd3MgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgcHJvZHVjdCBpbmZvcm1hdGlvbiBzaGVldCBmb3IgUXVhbnQtaVQgUGljb0dyZWVuIGRzRE5BIFJlYWdlbnQgYW5kIEtpdHMgZnJvbSBNb2xlY3VsYXIgUHJvYmVzLCBleGNlcHQgdGhhdCB0aGUgYXNzYXkgdm9sdW1lIGlzIHByb3BvcnRpb25hdGVseSByZWR1Y2VkIGZyb20gMi4wIG1MIHRvIDIwMCB1TCB0byBmaXQgYSA5Ni13ZWxsIG1pY3JvcGxhdGUgZm9ybWF0LgoKLSBQcmVwYXJlIDFYIFRFIGJ1ZmZlciAoMTAgbU0gVHJpcy1IQ2wsIDEgbU0gRURUQSwgcEggNy41KSBieSBkaWx1dGluZyB0aGUgY29uY2VudHJhdGVkIGJ1ZmZlciBmcm9tIHRoZSBraXQgMjAtZm9sZCB3aXRoIGRpc3RpbGxlZCBETmFzZS1mcmVlIHdhdGVyLCBhcyByZXF1aXJlZCBieSBNb2xlY3VsYXIgUHJvYmVzLiAgCi0gUHJlcGFyZSBhbiBhcXVlb3VzIHdvcmtpbmcgc29sdXRpb24gb2YgUXVhbnQtaVQgUGljb0dyZWVuIHJlYWdlbnQgYnkgbWFraW5nIGEgMjAwLWZvbGQgZGlsdXRpb24gb2YgdGhlIGNvbmNlbnRyYXRlZCBETVNPIHNvbHV0aW9uIGluIFRFIGJ1ZmZlciAocHJlcGFyZWQgYWJvdmUpLiAgUHJlcGFyYXRpb24gb2YgdGhlIHNvbHV0aW9uIGluIGEgcGxhc3RpYyBjb250YWluZXIsIHJhdGhlciB0aGFuIGdsYXNzLCBpcyByZWNvbW1lbmRlZCwgYXMgdGhlIHJlYWdlbnQgbWF5IGFkc29yYiB0byBnbGFzcyBzdXJmYWNlcy4gIFByb3RlY3QgdGhlIHNvbHV0aW9uIGZyb20gbGlnaHQgYnkgdXNpbmcgYW1iZXIgb3IgYnJvd24gdHViZXMsIG9yIGJ5IGNvdmVyaW5nIHdpdGggZm9pbC4gIFRoaXMgc29sdXRpb24gc2hvdWxkIGJlIHVzZWQgd2l0aGluIGEgZmV3IGhvdXJzIG9mIGl0cyBwcmVwYXJhdGlvbi4gIAotIEROQSBzdGFuZGFyZCBjdXJ2ZTogUHJlcGFyZSBhIDIgwrVnL21MIHN0b2NrIHNvbHV0aW9uIG9mIGRzRE5BIGluIFRFLiAgVGhlIGxhbWJkYSBETkEgc3RhbmRhcmQgcHJvdmlkZWQgd2l0aCB0aGUga2l0IGNhbiBiZSBkaWx1dGVkIDUwLWZvbGQgaW4gVEUgdG8gbWFrZSB0aGUgMiDCtWcvbUwgc29sdXRpb24uICBOb3RlOiBpbiBzb21lIGNhc2VzIGl0IG1heSBiZSBwcmVmZXJhYmxlIHRvIG1ha2UgdGhlIHN0YW5kYXJkIGN1cnZlIHVzaW5nIEROQSBzaW1pbGFyIHRvIHRoZSB0eXBlIGJlaW5nIGFzc2F5ZWQuICAKLSBBIGhpZ2gtcmFuZ2Ugc3RhbmRhcmQgY3VydmUgbWF5IGJlIHByZXBhcmVkIGZyb20gMSBuZy9tTCB0byAxIMK1Zy9tTCwgb3IgYSBsb3ctcmFuZ2Ugc3RhbmRhcmQgY3VydmUgbWF5IGJlIHByZXBhcmVkIGZyb20gMjUgcGcvbUwgdG8gMjUgbmcvbUwuICBGb3IgdGhlIGhpZ2gtcmFuZ2UgY3VydmUsIGZvbGxvdyB0aGUgZGlsdXRpb24gc2NoZW1lIHNob3duIGluIHRoZSBQaWNvR3JlZW4gcHJvZHVjdCBpbnNlcnQ7IGZvciB0aGUgbG93LXJhbmdlIGN1cnZlLCBkaWx1dGUgdGhlIDIgwrVnL21MIHNvbHV0aW9uIDQwLWZvbGQgdG8geWllbGQgYSA1MCBuZy9tTCBzb2x1dGlvbiwgYW5kIHJlZmVyIHRvIHRoZSBhbHRlcm5hdGl2ZSBkaWx1dGlvbiBzY2hlbWUgaW4gdGhlIHByb2R1Y3QgaW5zZXJ0LiAgCi0gUGlwZXQgc3RhbmRhcmRzIGludG8gYSBzb2xpZCBibGFjayA5Ni13ZWxsIG1pY3JvcGxhdGUgYXQgMTAwIMK1TCBwZXIgd2VsbCwgcHJlZmVyYWJseSBpbiB0cmlwbGljYXRlLiAgQmUgc3VyZSB0byBpbmNsdWRlIGEgc2V0IG9mIGJ1ZmZlciBibGFuayB3ZWxscyBjb250YWluaW5nIFRFIG9ubHkgKG5vIEROQSkuICAKLSBBZGQgMTAwIMK1TCBvZiB0aGUgYXF1ZW91cyB3b3JraW5nIHNvbHV0aW9uIG9mIFF1YW50LWlUIFBpY29HcmVlbiByZWFnZW50IHRvIGVhY2ggd2VsbC4gIE1peCB3ZWxsIGJ5IHRyaXR1cmF0aW9uIG9yIHBsYXRlIHNoYWtlciBhbmQgaW5jdWJhdGUgZm9yICAyIHRvIDUgbWludXRlcyBhdCByb29tIHRlbXBlcmF0dXJlLCBwcm90ZWN0ZWQgZnJvbSBsaWdodC4KCiMjIyMgUmVhZCB0aGUgbWljcm9wbGF0ZSAgCi0gTWFrZSBzdXJlIHRoZSBwdXJwbGUgcGxhdGUgYWRhcHRlciBpcyBpbiB0aGUgbWljcm9wbGF0ZSByZWFkZXIgZHJhd2VyLiAgUGxhY2UgdGhlIG1pY3JvcGxhdGUgaW4gdGhlIGRyYXdlci4gIAotIENsaWNrIHRoZSBSZWFkIGJ1dHRvbiBpbiB0aGUgU29mdE1heCBQcm8gc29mdHdhcmUuIFRoZSBpbnN0cnVtZW50IHdpbGwgcmVhZCB0aGUgcGxhdGUgYW5kIHRoZSByZWxhdGl2ZSBmbHVvcmVzY2VuY2UgdW5pdHMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFBsYXRlIHNlY3Rpb24gb2YgdGhlIHByb3RvY29sLgoKIAojIyMjIEFuYWx5emUgdGhlIGRhdGEgIAotIEFmdGVyIHRoZSBtaWNyb3BsYXRlIGhhcyBiZWVuIHJlYWQsIHRoZSByZWxhdGl2ZSBmbHVvcmVzY2VuY2UgdW5pdHMgKFJGVXMpIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQbGF0ZSBzZWN0aW9uLiAgVGhlIGRhdGEgd2lsbCBiZSBhbmFseXplZCBpbiB0aGUgR3JvdXAgVGFibGVzIHRoYXQgd2VyZSBjcmVhdGVkIHdoZW4gdGhlIHRlbXBsYXRlIHdhcyBzZXQgdXAuICAKLSBTdGFuZGFyZHMgYXNzaWduZWQgaW4gdGhlIFRlbXBsYXRlIChhbmQgdGh1cyBkaXNwbGF5ZWQgaW4gdGhlIFN0YW5kYXJkcyBncm91cCB0YWJsZSkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHBsb3R0ZWQgaW4gdGhlIFN0YW5kYXJkIEN1cnZlIHNlY3Rpb24gb2YgdGhlIHByb3RvY29sLiAgQSBsaW5lYXIgY3VydmUgZml0IGlzIGFwcGxpZWQgYnkgZGVmYXVsdCwgYnV0IGEgbG9nLWxvZyBmaXQgbWF5IGJlIHVzZWQgd2hlbiBwbG90dGluZyBhIHN0YW5kYXJkIGN1cnZlIG92ZXIgYSB3aWRlIGR5bmFtaWMgcmFuZ2UuICBDdXJ2ZSBmaXRzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZHJvcC1kb3duIEN1cnZlIEZpdCBtZW51IGluIHRoZSBncmFwaCBzZWN0aW9uJ3MgdG9vbCBiYXIuCgojIyBJbXBvcnQgdGhlIGRhdGEgZnJvbSB0aGUgcGxhdGUgcmVhZGVyIHRvIHRoZSBkYXRhYmFzZQpPbmNlIHlvdSBoYXZlIGNvbXBsZXRlZCBhbGwgb2YgdGhlIHN0ZXBzIGluIHRoZSBxdWFudF9wcmVwLnBkZiwgaXQgaXMgdGltZSB0byBpbXBvcnQgdGhlIGRhdGEgaW50byB0aGUgZGF0YWJhc2UgYW5kIG1ha2UgYSBub3RlIGZvciB5b3VyIGxhYiBub3RlYm9vawoKKipSZWFkIGluIHF1YW50aWZpY2F0aW9uIHJlc3VsdHMqKiAgCgoxLiBPcGVuIHRoZSBwbGF0ZSByZWFkZXIgcmVzdWx0cyBmaWxlIGFuZCBwdWxsIGluIHRoZSBkYXRhICAKCjwhLS0gIyB0cmllZCB0byB1c2UgcmVhZHIgaGVyZSBidXQgaXQgcmV0dXJucyBhbGwgTkFzIGZvciB0aGUgdGFibGUgLS0+CjwhLS0gIyBkYXQxIDwtIHJlYWRfdGFibGUoZmlsZSwgc2tpcCA9IDYsIG5fbWF4ID0gODgsIGNvbF9uYW1lcyA9IGMoIlNhbXBsZSIsIAkiV2VsbHMiLCAJIlJGVV9WYWx1ZXMiLCAJIkNvbmNlbnRyYXRpb24iLCAJIk1lYW5fQ29uYyIsIAkiU0QiLCAJIkNWIiwgCSJEaWx1dGlvbiIsIAkiQWRqQ29uYyIJKSkgLS0+CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0V9CiMgZGV0ZXJtaW5lIG51bWJlciBvZiBsaW5lcyB0byBza2lwIGJlZm9yZSBkYXRhIGJlZ2lucwpzdHJzIDwtIHJlYWRMaW5lcyhwYXJhbXMkZmlsZSwgc2tpcE51bCA9IFQpCiMgYWRkIHRoZSBcdCdzIGZvciB0aGlzIHJvdW5kIG9ubHksIGV4Y2VsIGFkZGVkIHRoZW0gaW4KbGluZXN0b3NraXAgPC0gd2hpY2goc3RycyA9PSAiR3JvdXA6IFVua25vd25zIikgIyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHNraXAKbnVtX2xpbmVzIDwtIGFzLm51bWVyaWMoc3Vic3RyKHBhcmFtcyRsYXN0X3NhbXBsZSwgMiwgNSkpIC0gYXMubnVtZXJpYyhzdWJzdHIocGFyYW1zJGZpcnN0X3NhbXBsZSwgMiwgNSkpICsgMQpgYGAKRm9yIHRoaXMgcm91bmQgb25seSBvcGVuaW5nIHRoZSB0eHQgZmlsZSBpbiBleGNlbCBhbmQgY2hhbmdpbmcgdGhlIG5hbWVzIG9mIHRoZSBzYW1wbGVzIHRoYXQgYXJlIGluIHNhbXBsZSBudW1iZXJzIGhpZ2hlciB0aGFuIHRoZSB0ZXN0IHNhbXBsZXMgaW4gdGhlIHN0YW5kYXJkcyBwbGF0ZS4gIAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0V9CiMgY3JlYXRlIGEgdGFibGUgdGhhdCBjb250YWlucyB3ZWxsIGxvY2F0aW9ucyBhbmQgcXVhbnRpdGllcwpkYXQgPC0gcmVhZC50YWJsZSh0ZXh0PXN0cnMsICBza2lwID0gbGluZXN0b3NraXAsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFQsIGZpbGwgPSBULCBzdHJpbmdzQXNGYWN0b3JzID0gRiwgbnJvd3MgPSBudW1fbGluZXMpICU+JSAKICByZW5hbWUod2VsbCA9IFdlbGxzKSAlPiUgCiAgbXV0YXRlKFNhbXBsZSA9IGFzLm51bWVyaWMoU2FtcGxlKSkgJT4lCiAgYXJyYW5nZShTYW1wbGUpICU+JSAKICBzZWxlY3QoU2FtcGxlLCB3ZWxsLCBBZGpDb25jKQpgYGAKMi4gQ29ubmVjdCBuYW1lcyBvZiBzYW1wbGVzIGZyb20gZGF0YWJhc2UKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KIyBwdWxsIGluIHRoZSBmdWxsIGRhdGFiYXNlIHRhYmxlCmRiX2RhdCA8LSBkYlJlYWRUYWJsZShsYWIsIHBhcmFtcyR0eXBlKQoKIyBzZWxlY3QgeW91ciBzYW1wbGVzCmlmIChwYXJhbXMkdHlwZSA9PSAiZXh0cmFjdGlvbiIpewogIHNhbXAgPC0gZGJfZGF0ICU+JQogICAgc2VsZWN0KGNvbnRhaW5zKCJpZCIpLCB3ZWxsLCBwbGF0ZSkgJT4lIAogICAgIyBuYXJyb3cgZG93biB0aGUgcmVzdWx0cyB0byBqdXN0IHRoaXMgYmF0Y2gKICAgIGZpbHRlcihleHRyYWN0aW9uX2lkID49IHBhcmFtcyRmaXJzdF9zYW1wbGUsIAogICAgICAgICAgIGV4dHJhY3Rpb25faWQgPD0gcGFyYW1zJGxhc3Rfc2FtcGxlKSAlPiUgCiAgICAjIHB1bGwgb3V0IGNvbCBhbmQgcm93IHNvIHRoYXQgdGhlIHNhbXBsZXMgY2FuIGJlIHNvcnRlZCAobm90IGFsd2F5cyBpbiBwbGF0ZXMgaW4gaWQgb3JkZXIpCiAgICBtdXRhdGUocm93ID0gc3Vic3RyKHdlbGwsIDEsIDEpLCAKICAgICAgICAgICBjb2wgPSBzdWJzdHIod2VsbCwgMiwgMykpICU+JSAKICAgICMgc29ydCBieSBwbGF0ZSwgdGhlbiBjb2wsIHRoZW4gcm93CiAgICBhcnJhbmdlKHBsYXRlLCBjb2wsIHJvdykgCn0KCmlmIChwYXJhbXMkdHlwZSA9PSAiZGlnZXN0Iil7CiAgc2FtcCA8LSBkYl9kYXQgJT4lCiAgICBzZWxlY3QoY29udGFpbnMoImlkIiksIHdlbGwsIHBsYXRlKSAlPiUgCiAgICAjIG5hcnJvdyBkb3duIHRoZSByZXN1bHRzIHRvIGp1c3QgdGhpcyBiYXRjaAogICAgZmlsdGVyKGRpZ2VzdF9pZCA+PSBwYXJhbXMkZmlyc3Rfc2FtcGxlLCAKICAgICAgICAgICBkaWdlc3RfaWQgPD0gcGFyYW1zJGxhc3Rfc2FtcGxlKSAlPiUgCiAgICAjIHB1bGwgb3V0IGNvbCBhbmQgcm93IHNvIHRoYXQgdGhlIHNhbXBsZXMgY2FuIGJlIHNvcnRlZCAobm90IGFsd2F5cyBpbiBwbGF0ZXMgaW4gaWQgb3JkZXIpCiAgICBtdXRhdGUocm93ID0gc3Vic3RyKHdlbGwsIDEsIDEpLCAKICAgICAgICAgICBjb2wgPSBzdWJzdHIod2VsbCwgMiwgMykpICU+JSAKICAgICMgc29ydCBieSBwbGF0ZSwgdGhlbiBjb2wsIHRoZW4gcm93CiAgICBhcnJhbmdlKHBsYXRlLCBjb2wsIHJvdykgCn0KCiAjIGRlZmluZSB0aGUgcGxhdGVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhpcyBncm91cAogIHBsYXRlcyA8LSBzYW1wICU+JQogICAgc2VsZWN0KHBsYXRlKSAlPiUKICAgIGRpc3RpbmN0KCkgJT4lCiAgICBhcnJhbmdlKHBsYXRlKQoKICAjIGF0dGFjaCB0aGVzZSBwbGF0ZXMgdG8gdGhlIHF1YW50IGRhdGEKICBkYXQkcGxhdGUgPC0gTkEKICBmb3IgKGkgaW4gMTpucm93KHBsYXRlcykpewogICAgeCA9IGkqOTYKICAgIHkgPSB4IC0gOTUKICAgIGRhdCA8LSBkYXQgJT4lCiAgbXV0YXRlKHBsYXRlID0gaWZlbHNlKFNhbXBsZSA+PSB5ICYgU2FtcGxlIDw9IHgsIHBsYXRlcyRwbGF0ZVtpXSwgcGxhdGUpKQogIH0KCiAgCiAgc2FtcCA8LSBzYW1wICU+JSAKICAgICMgZ2V0IHJpZCBvZiBleHRyYSBjb2x1bW5zCiAgICBzZWxlY3QoLXJvdywgLWNvbCkKCiMgam9pbiB0aGUgaWRzIHRvIHRoZSBxdWFudGlmaWNhdGlvbiBkYXRhCnF1YW50MSA8LSBsZWZ0X2pvaW4oc2FtcCwgZGF0LCBieSA9IGMoInBsYXRlIiwgIndlbGwiKSkgJT4lCiAgc2VsZWN0KGNvbnRhaW5zKCJpZCIpLCBBZGpDb25jKSAlPiUKICAjIHJlbmFtZSB0aGUgcXVhbnQgY29sdW1uIHNvIGl0IGNhbiBiZSBqb2luZWQgdG8gdGhlIGRiCiAgcmVuYW1lKHF1YW50ID0gQWRqQ29uYykgJT4lIAogICMgcmVtb3ZlIGFueSBlbXB0eSB3ZWxscwogIGZpbHRlcighaXMubmEocXVhbnQpKQprYWJsZShxdWFudDEsIGxvbmd0YWJsZSA9IFQpICU+JSAKICBrYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpCgoKIyB0aGUgZW50aXJlIHRhYmxlIHdhcyBwdWxsZWQgaW4gYXMgZGF0IGFib3ZlCmlmIChwYXJhbXMkaWQgPT0gImV4dHJhY3Rpb25faWQiKXsKICBjaGFuZ2UgPC0gZGJfZGF0ICU+JQogICAgZmlsdGVyKGV4dHJhY3Rpb25faWQgJWluJSBxdWFudDEkZXh0cmFjdGlvbl9pZCkgICU+JQogICAgIyBkb24ndCBicmluZyBpbiB0aGUgcXVhbnQgY29sdW1uLCB3aWxsIGFkZCB0aGF0IGhlcmUKICAgIHNlbGVjdCgtcXVhbnQpIAp9CmlmIChwYXJhbXMkaWQgPT0gImRpZ2VzdF9pZCIpewogIGNoYW5nZSA8LSBkYl9kYXQgJT4lCiAgICBmaWx0ZXIoZGlnZXN0X2lkICVpbiUgcXVhbnQxJGRpZ2VzdF9pZCkgICU+JQogICAgIyBkb24ndCBicmluZyBpbiB0aGUgcXVhbnQgY29sdW1uLCB3aWxsIGFkZCB0aGF0IGhlcmUKICAgIHNlbGVjdCgtcXVhbnQpIAp9CgojIGFkZCBpbiB0aGUgbmV3IHF1YW50cwppZHMgPC0gY2hhbmdlICU+JQogIHNlbGVjdChjb250YWlucygiaWQiKSkKY2hhbmdlIDwtIGxlZnRfam9pbihjaGFuZ2UsIHF1YW50MSwgYnkgPSBjKG5hbWVzKGlkcykpKQoKZGJfZGF0IDwtIGNoYW5nZV9yb3dzKGRiX2RhdCwgY2hhbmdlLCBwYXJhbXMkaWQpCmBgYApEb3VibGUgY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIHJvd3MgZm9yIGVhY2ggcGxhdGUgaXMgd2hhdCBpcyBleHBlY3RlZAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXZhbD1GQUxTRX0KY2hlY2sgPC0gZGF0ICU+JQogIGdyb3VwX2J5KHBsYXRlKSAlPiUgCiAgc3VtbWFyaXNlKHJvd3MgPSBuKCkpCmthYmxlKGNoZWNrKSAlPiUgCiAga2FibGVfc3R5bGluZygpCmBgYApXcml0ZSB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGRhdGFiYXNlCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGV2YWw9RkFMU0V9CiMgZGJXcml0ZVRhYmxlKGxhYiwgcGFyYW1zJHR5cGUsIGRiX2RhdCwgcm93Lm5hbWVzID0gRiwgb3ZlcndyaXRlID0gVCkKIyBkYkRpc2Nvbm5lY3QobGFiKQpgYGAK