getprop("ro.product.device") == "jason" || abort("E3004: This package is for \"jason\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/jason/jason:8.1.0/OPM1.171019.019/9.5.6:user/release-keys");
ui_print("Target: Xiaomi/jason/jason:8.1.0/OPM1.171019.019/9.5.9:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/jason/jason:8.1.0/OPM1.171019.019/9.5.6:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/jason/jason:8.1.0/OPM1.171019.019/9.5.9:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/jason/jason:8.1.0/OPM1.171019.019/9.5.6:user/release-keys or Xiaomi/jason/jason:8.1.0/OPM1.171019.019/9.5.9:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:51455306:dfc840c8708541019f3b457fae3368807eecb2e9:51455306:f589b8f4955c02fd4391b744c740b9b4cd2a7774") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:51455306:dfc840c8708541019f3b457fae3368807eecb2e9:51455306:f589b8f4955c02fd4391b744c740b9b4cd2a7774\" has unexpected contents.");
apply_patch_space(54571008) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "388,1,320,321,806,828,829,20988,20993,20996,21000,21127,21128,21132,21136,21146,21147,21149,21153,21156,21163,21167,21171,21190,21191,21194,21198,21223,21224,21233,21237,21603,21604,21621,21625,21770,21771,21776,21780,21787,21788,21821,21827,21828,21829,21834,21835,21844,22796,22798,22802,22810,22811,22816,22820,22824,22825,22829,22835,22868,22869,22882,22886,22902,22903,22906,22910,22919,22920,22924,22928,22940,22945,22954,22958,22972,22973,25187,25193,25663,25664,25846,25850,25851,25852,25861,25863,25867,26611,26614,26618,26627,26628,26631,26635,26643,26644,26646,26647,27811,27815,27832,29031,29034,29038,29045,29046,29048,29052,29056,29057,29111,29115,29204,29205,29250,29254,29836,29837,29839,29843,29867,29868,31270,31274,31275,31276,31277,31278,31285,31286,31299,31300,31301,31302,31306,31308,31316,31320,31341,31342,31345,31349,31357,31358,32410,32414,32438,32439,32452,32456,32459,32482,32487,32491,32495,32585,32766,32767,32768,32770,33089,33090,61974,65535,65536,65537,66043,98302,98304,98306,98625,98626,102467,102469,102497,102498,102593,102597,103033,103034,103041,103045,103051,103052,103358,103362,104708,104925,104936,105468,105509,105513,105514,105515,105526,105527,105530,106332,106386,106390,107174,107175,107178,107182,107223,107224,110131,110135,112173,112174,115914,115920,115954,115955,115973,115978,115982,116032,117527,117567,117575,117977,118697,118701,118731,119915,120327,120330,121144,131071,131072,131073,131579,163839,163840,163842,164161,164162,175157,196607,196608,196609,197115,201675,229376,229378,229697,229698,244996,262143,262144,262145,262651,262726,294912,294914,295233,295234,323960,323964,324535,324538,325113,325114,325117,325121,325152,325153,325508,325512,325573,327679,327680,327681,328187,360447,360448,360449,360955,360968,393216,393217,393723,425983,425984,425985,426491,458751,458752,458753,459259,491519,491520,491521,492027,524287,524288,524289,524795,557055,557056,557057,557563,589823,589824,589825,590331,622591,622592,622593,623099,655359,655360,655361,655867,688127,688128,688129,688635,720894,720896,720897,721403,753662,753664,753665,754171,786430,786432,786433,786939,819198,819200,819202,819521,819522,820823,851966,851968,851969,852475,884734,884736,884738,885057,885058,907211,917502,917504,917505,918011,946553,950272,950273,983040,983041,1015808,1015809,1048576,1048577,1081344,1081345,1114112,1114113,1146880,1146881,1179648,1179649,1212416,1212417,1245184,1245185,1277952,1277953,1278459,1284343,1290229,1290234,1290244,1290245,1290247,1290251,1290264,1290267,1290268,1300430,1300437,1310720") == "cd7c7584797159ebd95c5417c73583d06448671c" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "388,1,320,321,806,828,829,20988,20993,20996,21000,21127,21128,21132,21136,21146,21147,21149,21153,21156,21163,21167,21171,21190,21191,21194,21198,21223,21224,21233,21237,21603,21604,21621,21625,21770,21771,21776,21780,21787,21788,21821,21827,21828,21829,21834,21835,21844,22796,22798,22802,22810,22811,22816,22820,22824,22825,22829,22835,22868,22869,22882,22886,22902,22903,22906,22910,22919,22920,22924,22928,22940,22945,22954,22958,22972,22973,25187,25193,25663,25664,25846,25850,25851,25852,25861,25863,25867,26611,26614,26618,26627,26628,26631,26635,26643,26644,26646,26647,27811,27815,27832,29031,29034,29038,29045,29046,29048,29052,29056,29057,29111,29115,29204,29205,29250,29254,29836,29837,29839,29843,29867,29868,31270,31274,31275,31276,31277,31278,31285,31286,31299,31300,31301,31302,31306,31308,31316,31320,31341,31342,31345,31349,31357,31358,32410,32414,32438,32439,32452,32456,32459,32482,32487,32491,32495,32585,32766,32767,32768,32770,33089,33090,61974,65535,65536,65537,66043,98302,98304,98306,98625,98626,102467,102469,102497,102498,102593,102597,103033,103034,103041,103045,103051,103052,103358,103362,104708,104925,104936,105468,105509,105513,105514,105515,105526,105527,105530,106332,106386,106390,107174,107175,107178,107182,107223,107224,110131,110135,112173,112174,115914,115920,115954,115955,115973,115978,115982,116032,117527,117567,117575,117977,118697,118701,118731,119915,120327,120330,121144,131071,131072,131073,131579,163839,163840,163842,164161,164162,175157,196607,196608,196609,197115,201675,229376,229378,229697,229698,244996,262143,262144,262145,262651,262726,294912,294914,295233,295234,323960,323964,324535,324538,325113,325114,325117,325121,325152,325153,325508,325512,325573,327679,327680,327681,328187,360447,360448,360449,360955,360968,393216,393217,393723,425983,425984,425985,426491,458751,458752,458753,459259,491519,491520,491521,492027,524287,524288,524289,524795,557055,557056,557057,557563,589823,589824,589825,590331,622591,622592,622593,623099,655359,655360,655361,655867,688127,688128,688129,688635,720894,720896,720897,721403,753662,753664,753665,754171,786430,786432,786433,786939,819198,819200,819202,819521,819522,820823,851966,851968,851969,852475,884734,884736,884738,885057,885058,907211,917502,917504,917505,918011,946553,950272,950273,983040,983041,1015808,1015809,1048576,1048577,1081344,1081345,1114112,1114113,1146880,1146881,1179648,1179649,1212416,1212417,1245184,1245185,1277952,1277953,1278459,1284343,1290229,1290234,1290244,1290245,1290247,1290251,1290264,1290267,1290268,1300430,1300437,1310720") && block_image_verify("/dev/block/bootdevice/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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:51455306:dfc840c8708541019f3b457fae3368807eecb2e9:51455306:f589b8f4955c02fd4391b744c740b9b4cd2a7774",
            "-", f589b8f4955c02fd4391b744c740b9b4cd2a7774, 51455306,
            dfc840c8708541019f3b457fae3368807eecb2e9, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
show_progress(0.600000, 400);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
show_progress(0.100000, 2);
