getprop("ro.product.device") == "px30_evb" || abort("E3004: This package is for \"px30_evb\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/181042:userdebug/test-keys");
ui_print("Target: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/150039:userdebug/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/181042:userdebug/test-keys" ||
    getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/150039:userdebug/test-keys" ||
    abort("E3001: Package expects build fingerprint of rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/181042:userdebug/test-keys or rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/150039:userdebug/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_check("EMMC:/dev/block/by-name/boot:24616960:c6d2836f0ef3c9731db3eb0b735b638d51fc46c0:24616960:ba8c54a13eb86afad665dbf98d11637feff99410") || abort("E3005: \"EMMC:/dev/block/by-name/boot:24616960:c6d2836f0ef3c9731db3eb0b735b638d51fc46c0:24616960:ba8c54a13eb86afad665dbf98d11637feff99410\" has unexpected contents.");
apply_patch_space(50335744) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/by-name/system", "308,1,203,214,380,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16455,16457,17729,17730,18062,18064,18167,18170,18196,18197,21713,21716,21782,21785,23892,23895,24126,24129,24139,24142,24240,24241,24930,24931,24938,24940,24976,24979,25004,25005,25010,25014,25022,25025,26362,26365,26793,26794,26815,26817,26825,26826,26828,26830,26836,26837,28789,28791,29289,29290,29295,29297,29406,29409,29728,29729,29744,29746,29767,29768,29772,29774,29786,29789,29809,29810,29816,29819,31264,31265,31323,31325,31333,31334,32656,32658,32768,32770,33389,33390,33415,33417,33441,33442,33444,33446,33454,33455,33482,33484,33634,33635,33637,33639,33648,33651,33736,33739,33755,33756,33803,33805,33858,33861,34232,34233,35718,35719,36168,36169,36210,36211,36222,36223,57981,57982,67586,67588,77484,77485,77981,77982,98304,98306,98805,98806,101487,101488,105064,105065,105271,105272,111342,111343,126507,126508,126524,126525,128948,128950,130532,130533,130536,130537,131072,131073,139486,139487,142618,142619,143048,143049,143778,143779,143827,143828,143832,143833,143835,143836,143837,143838,144097,144098,144107,144108,144587,144588,144610,144611,144612,144613,144743,144744,144962,144963,145049,145050,145066,145070,145081,145082,145086,145088,145095,145100,145171,145172,145181,145183,145192,145193,145200,145201,145261,145263,145272,145273,145298,145300,145330,145331,145333,145336,159176,159179,159196,159197,159404,159408,160268,160271,163840,163842,164515,164518,165148,165149,165349,165351,165417,165420,165519,165521,165980,165981,165999,166001,166012,166013,168919,168920,169033,169035,169064,169065,169069,169073,169084,169087,169104,169109,169119,169120,169212,169214,169230,169231,169233,169235,169247,169250,169272,169275,169398,169400,169576,169577,169655,169657,169689,169690,172007,172011,172669,172670,173428,173430,173433,173434,173439,173441,173451,173454,173592,173593,213163,213164,229376,229378,232840,232842,269130,269131,269658,269661,269669,294914,295102,365497,387072,390122,390129,393216") == "02dafb6de9cae328709a406f2eafe9e523de014d" || block_image_verify("/dev/block/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/by-name/system");
ifelse (block_image_recover("/dev/block/by-name/system", "308,1,203,214,380,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16455,16457,17729,17730,18062,18064,18167,18170,18196,18197,21713,21716,21782,21785,23892,23895,24126,24129,24139,24142,24240,24241,24930,24931,24938,24940,24976,24979,25004,25005,25010,25014,25022,25025,26362,26365,26793,26794,26815,26817,26825,26826,26828,26830,26836,26837,28789,28791,29289,29290,29295,29297,29406,29409,29728,29729,29744,29746,29767,29768,29772,29774,29786,29789,29809,29810,29816,29819,31264,31265,31323,31325,31333,31334,32656,32658,32768,32770,33389,33390,33415,33417,33441,33442,33444,33446,33454,33455,33482,33484,33634,33635,33637,33639,33648,33651,33736,33739,33755,33756,33803,33805,33858,33861,34232,34233,35718,35719,36168,36169,36210,36211,36222,36223,57981,57982,67586,67588,77484,77485,77981,77982,98304,98306,98805,98806,101487,101488,105064,105065,105271,105272,111342,111343,126507,126508,126524,126525,128948,128950,130532,130533,130536,130537,131072,131073,139486,139487,142618,142619,143048,143049,143778,143779,143827,143828,143832,143833,143835,143836,143837,143838,144097,144098,144107,144108,144587,144588,144610,144611,144612,144613,144743,144744,144962,144963,145049,145050,145066,145070,145081,145082,145086,145088,145095,145100,145171,145172,145181,145183,145192,145193,145200,145201,145261,145263,145272,145273,145298,145300,145330,145331,145333,145336,159176,159179,159196,159197,159404,159408,160268,160271,163840,163842,164515,164518,165148,165149,165349,165351,165417,165420,165519,165521,165980,165981,165999,166001,166012,166013,168919,168920,169033,169035,169064,169065,169069,169073,169084,169087,169104,169109,169119,169120,169212,169214,169230,169231,169233,169235,169247,169250,169272,169275,169398,169400,169576,169577,169655,169657,169689,169690,172007,172011,172669,172670,173428,173430,173433,173434,173439,173441,173451,173454,173592,173593,213163,213164,229376,229378,232840,232842,269130,269131,269658,269661,269669,294914,295102,365497,387072,390122,390129,393216") && block_image_verify("/dev/block/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1("/dev/block/by-name/vendor", "114,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4349,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,24997,25726,26380,29425,31886,31894,32200,32201,32539,32540,32768,32770,32817,32818,37765,37766,39585,39586,40083,40084,41061,41062,41385,41386,41876,41877,41896,41897,42295,42296,46895,46896,48942,48943,49142,49143,49344,49345,49501,49502,49821,49823,50100,50101,50140,50141,50175,50176,50256,50257,51490,51495,51763,51795,51817,51818,52518,52519,53255,53256,58225,58235,63460,63461,63594,63627,64156,64157,64738,64744,91547,91549,91554,91926,92438,92837,96760,97524,97531,98304") == "edbb71d541f1d3c370f847720f009f5425f7e6a9" || block_image_verify("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/by-name/vendor");
ifelse (block_image_recover("/dev/block/by-name/vendor", "114,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4349,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,24997,25726,26380,29425,31886,31894,32200,32201,32539,32540,32768,32770,32817,32818,37765,37766,39585,39586,40083,40084,41061,41062,41385,41386,41876,41877,41896,41897,42295,42296,46895,46896,48942,48943,49142,49143,49344,49345,49501,49502,49821,49823,50100,50101,50140,50141,50175,50176,50256,50257,51490,51495,51763,51795,51817,51818,52518,52519,53255,53256,58225,58235,63460,63461,63594,63627,64156,64157,64738,64744,91547,91549,91554,91926,92438,92837,96760,97524,97531,98304") && block_image_verify("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;
if (range_sha1("/dev/block/by-name/oem", "22,1,36,37,39,2053,2060,2750,2754,6061,6062,6064,6065,8973,9005,32768,32770,32801,32802,64504,65014,65021,65536") == "785ffa6eb72c0d411a91b30849e81a7c9dd66a50" || block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat")) then
ui_print("Verified oem image...");
else
check_first_block("/dev/block/by-name/oem");
ifelse (block_image_recover("/dev/block/by-name/oem", "22,1,36,37,39,2053,2060,2750,2754,6061,6062,6064,6065,8973,9005,32768,32770,32801,32802,64504,65014,65021,65536") && block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat"), ui_print("oem recovered successfully."), abort("E2004: oem partition fails to recover"));
endif;

# ---- start making changes here ----

ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update("/dev/block/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
ui_print("Patching oem image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat") ||
  abort("E2001: Failed to update oem image.");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/by-name/boot:24616960:c6d2836f0ef3c9731db3eb0b735b638d51fc46c0:24616960:ba8c54a13eb86afad665dbf98d11637feff99410",
            "-", ba8c54a13eb86afad665dbf98d11637feff99410, 24616960,
            c6d2836f0ef3c9731db3eb0b735b638d51fc46c0,
            package_extract_file("patch/boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:24616960:c6d2836f0ef3c9731db3eb0b735b638d51fc46c0:24616960:ba8c54a13eb86afad665dbf98d11637feff99410");
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
