getprop("ro.product.device") == "equuleus" || abort("E3004: This package is for \"equuleus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/equuleus/equuleus:10/QKQ1.190828.002/V12.0.3.0.QECCNXM:user/release-keys");
ui_print("Target: Xiaomi/equuleus/equuleus:10/QKQ1.190828.002/V12.0.4.0.QECCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/equuleus/equuleus:10/QKQ1.190828.002/V12.0.3.0.QECCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/equuleus/equuleus:10/QKQ1.190828.002/V12.0.4.0.QECCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/equuleus/equuleus:10/QKQ1.190828.002/V12.0.3.0.QECCNXM:user/release-keys or Xiaomi/equuleus/equuleus:10/QKQ1.190828.002/V12.0.4.0.QECCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:45307210:dfec8fb9ed02920503d797e1378ef3cffa3b7f64",
                      "EMMC:/dev/block/bootdevice/by-name/boot:45307210:9e6c32cd42e0002eb0ed8fbbd20062a7dd354990") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:45307210:dfec8fb9ed02920503d797e1378ef3cffa3b7f64\" or \"EMMC:/dev/block/bootdevice/by-name/boot:45307210:9e6c32cd42e0002eb0ed8fbbd20062a7dd354990\" has unexpected contents.");
apply_patch_space(45307210) || 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", "510,1,582,698,712,744,751,753,754,1000,1005,1007,1008,1114,1115,1599,1600,2288,2289,2291,2293,2294,2295,2310,2311,2492,2493,3664,3665,3667,3668,3672,3673,3681,3682,3683,3684,5517,5787,9041,9042,9044,9450,9452,9453,10449,10451,16390,16391,16524,16525,19294,19296,25543,25545,32768,32770,32959,32960,34681,34682,34684,34686,34745,34746,34879,34881,35111,35112,35180,35181,35190,35191,35639,35642,35648,35649,35654,35655,35699,35702,35713,35714,35839,35840,35843,35844,35861,37163,38467,38468,38476,38477,38482,38483,38485,38486,40848,40849,40851,40852,40939,40940,41023,41024,42777,42778,43060,43061,43309,43310,43456,43457,44473,44474,44835,44836,44872,44873,50492,50494,55864,55865,56003,56004,56010,56011,56024,56025,56647,56648,57538,57539,57801,57802,57978,57979,60226,60227,60712,60713,63261,63262,65536,65537,69253,69254,71038,71039,71111,71112,75776,75779,77956,77957,80580,80581,80721,80722,80869,80870,83008,83009,83021,83022,83650,83651,97671,97672,97848,97851,98304,98306,98495,98496,99561,99564,101212,101213,101262,101263,101266,101269,103316,103317,103375,103376,103397,103398,104121,104124,104141,104142,104390,104393,104559,104560,104601,104602,105903,105904,105974,105975,106021,106022,106348,106349,106503,106504,114672,114673,114712,114713,117328,117331,121004,121005,121010,121011,121408,121409,122109,122110,122116,122117,125042,125043,126587,126588,131072,131073,139718,139720,144896,144897,145281,145283,145808,145809,146256,146257,146261,146262,146274,146275,146279,146280,146291,146292,146667,146668,146691,146692,147974,147975,148129,148130,148211,148214,148227,148230,149126,149129,153038,153039,153305,153308,155270,155271,155492,155493,158122,158123,158130,158131,158143,158144,158480,158481,160224,160225,160659,160660,162407,162408,163840,163842,164031,164032,165846,165851,170284,170285,177806,177807,183028,183029,183639,183640,187658,187659,189091,189092,193835,193836,196608,196609,199710,199711,201679,201680,202475,202476,207113,207114,210491,210492,217053,217054,222148,222149,229358,229359,229376,229378,229567,229568,230362,230363,230375,230376,230386,230389,230390,230391,230392,230393,230395,230396,230397,230398,230450,230451,230536,230539,230542,230543,230549,230550,230573,230574,230635,230636,230639,230644,230645,230646,230647,230648,230649,230650,231444,231445,231451,231452,232005,232007,232560,232562,232563,232564,232565,232566,232567,232568,232569,232570,232571,232572,232573,232574,232575,232576,232577,232580,234040,234042,234123,234124,234126,236048,236051,236053,236311,236312,236319,236321,236809,236811,236919,236920,236950,236951,236962,236963,237229,237230,237343,237344,237360,237362,238678,238679,252372,252373,260243,260244,262144,262145,262815,262816,263093,263094,266444,276562,281885,282401,284997,284998,285161,285162,288975,294914,295103,295104,295610,300292,308197,308883,311911,311921,312940,312941,315816,323365,323670,324172,324207,324489,324503,324507,324516,324519,324529,324531,324552,327681,328187,334585,334803,338285,339235,340392,340489,340490,344892,344893,345241,345242,345557,345558,345573,345574,345601,345602,345645,345646,346322,346333,348024,360449,360955,393217,393723,425985,426491,458753,459259,491521,492027,524289,524795,557057,557563,589825,590331,622593,623099,655361,655867,688129,688635,720897,721403,753665,754171,755738,774155,780254,780261,780379") == "1e2934ee816b9b3be9f488a5f736252646f2a21d" || 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", "510,1,582,698,712,744,751,753,754,1000,1005,1007,1008,1114,1115,1599,1600,2288,2289,2291,2293,2294,2295,2310,2311,2492,2493,3664,3665,3667,3668,3672,3673,3681,3682,3683,3684,5517,5787,9041,9042,9044,9450,9452,9453,10449,10451,16390,16391,16524,16525,19294,19296,25543,25545,32768,32770,32959,32960,34681,34682,34684,34686,34745,34746,34879,34881,35111,35112,35180,35181,35190,35191,35639,35642,35648,35649,35654,35655,35699,35702,35713,35714,35839,35840,35843,35844,35861,37163,38467,38468,38476,38477,38482,38483,38485,38486,40848,40849,40851,40852,40939,40940,41023,41024,42777,42778,43060,43061,43309,43310,43456,43457,44473,44474,44835,44836,44872,44873,50492,50494,55864,55865,56003,56004,56010,56011,56024,56025,56647,56648,57538,57539,57801,57802,57978,57979,60226,60227,60712,60713,63261,63262,65536,65537,69253,69254,71038,71039,71111,71112,75776,75779,77956,77957,80580,80581,80721,80722,80869,80870,83008,83009,83021,83022,83650,83651,97671,97672,97848,97851,98304,98306,98495,98496,99561,99564,101212,101213,101262,101263,101266,101269,103316,103317,103375,103376,103397,103398,104121,104124,104141,104142,104390,104393,104559,104560,104601,104602,105903,105904,105974,105975,106021,106022,106348,106349,106503,106504,114672,114673,114712,114713,117328,117331,121004,121005,121010,121011,121408,121409,122109,122110,122116,122117,125042,125043,126587,126588,131072,131073,139718,139720,144896,144897,145281,145283,145808,145809,146256,146257,146261,146262,146274,146275,146279,146280,146291,146292,146667,146668,146691,146692,147974,147975,148129,148130,148211,148214,148227,148230,149126,149129,153038,153039,153305,153308,155270,155271,155492,155493,158122,158123,158130,158131,158143,158144,158480,158481,160224,160225,160659,160660,162407,162408,163840,163842,164031,164032,165846,165851,170284,170285,177806,177807,183028,183029,183639,183640,187658,187659,189091,189092,193835,193836,196608,196609,199710,199711,201679,201680,202475,202476,207113,207114,210491,210492,217053,217054,222148,222149,229358,229359,229376,229378,229567,229568,230362,230363,230375,230376,230386,230389,230390,230391,230392,230393,230395,230396,230397,230398,230450,230451,230536,230539,230542,230543,230549,230550,230573,230574,230635,230636,230639,230644,230645,230646,230647,230648,230649,230650,231444,231445,231451,231452,232005,232007,232560,232562,232563,232564,232565,232566,232567,232568,232569,232570,232571,232572,232573,232574,232575,232576,232577,232580,234040,234042,234123,234124,234126,236048,236051,236053,236311,236312,236319,236321,236809,236811,236919,236920,236950,236951,236962,236963,237229,237230,237343,237344,237360,237362,238678,238679,252372,252373,260243,260244,262144,262145,262815,262816,263093,263094,266444,276562,281885,282401,284997,284998,285161,285162,288975,294914,295103,295104,295610,300292,308197,308883,311911,311921,312940,312941,315816,323365,323670,324172,324207,324489,324503,324507,324516,324519,324529,324531,324552,327681,328187,334585,334803,338285,339235,340392,340489,340490,344892,344893,345241,345242,345557,345558,345573,345574,345601,345602,345645,345646,346322,346333,348024,360449,360955,393217,393723,425985,426491,458753,459259,491521,492027,524289,524795,557057,557563,589825,590331,622593,623099,655361,655867,688129,688635,720897,721403,753665,754171,755738,774155,780254,780261,780379") && 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;
if (range_sha1("/dev/block/bootdevice/by-name/vendor", "226,1,219,570,578,588,589,670,671,735,736,738,739,741,752,757,758,760,761,769,770,2922,2923,2977,3027,3046,3351,3418,3419,6512,6513,6631,6632,6754,6806,7517,7518,8201,8202,8799,8805,11058,11060,32464,32465,32768,32770,32832,32833,34224,34225,41166,41168,41311,41312,41674,41676,42092,42093,42145,42146,44080,44083,44101,44102,44147,44148,44166,44167,44169,44170,44218,44219,44246,44247,44843,44844,44869,44870,44904,44905,45105,45109,45238,45239,45256,45257,54147,54149,60285,60286,60288,60289,60864,60866,65536,65537,67681,67682,67692,67693,67730,67731,67732,67733,67753,67754,68179,68180,68233,68234,68575,68577,68578,68584,68589,68591,68597,68608,68643,68644,68646,68650,68788,68812,74195,74196,74304,74321,74346,74358,74426,74437,74445,74461,74469,75637,75707,75750,75945,75955,76100,76114,83110,83112,84089,84090,84871,85671,93385,93386,98304,98306,98368,98369,114334,114335,118863,118864,131072,131073,138037,138146,138325,138326,141547,141567,142330,142360,150979,150980,151690,151747,151950,151951,151974,151975,152770,152771,153280,155583,156001,156014,156245,156246,157718,157803,160740,160742,161840,161841,161933,161934,162197,162199,163483,163484,163840,163842,163904,163905,165079,165080,165396,165397,171849,171850,174575,174576,179915,179916,187495,187496,189449,189610,190300,196609,197114,216372,229376,229378,229440,229441,258044,260078,260085,260214") == "47af5408caf49fab999a431530c43d8cde98b27f" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "226,1,219,570,578,588,589,670,671,735,736,738,739,741,752,757,758,760,761,769,770,2922,2923,2977,3027,3046,3351,3418,3419,6512,6513,6631,6632,6754,6806,7517,7518,8201,8202,8799,8805,11058,11060,32464,32465,32768,32770,32832,32833,34224,34225,41166,41168,41311,41312,41674,41676,42092,42093,42145,42146,44080,44083,44101,44102,44147,44148,44166,44167,44169,44170,44218,44219,44246,44247,44843,44844,44869,44870,44904,44905,45105,45109,45238,45239,45256,45257,54147,54149,60285,60286,60288,60289,60864,60866,65536,65537,67681,67682,67692,67693,67730,67731,67732,67733,67753,67754,68179,68180,68233,68234,68575,68577,68578,68584,68589,68591,68597,68608,68643,68644,68646,68650,68788,68812,74195,74196,74304,74321,74346,74358,74426,74437,74445,74461,74469,75637,75707,75750,75945,75955,76100,76114,83110,83112,84089,84090,84871,85671,93385,93386,98304,98306,98368,98369,114334,114335,118863,118864,131072,131073,138037,138146,138325,138326,141547,141567,142330,142360,150979,150980,151690,151747,151950,151951,151974,151975,152770,152771,153280,155583,156001,156014,156245,156246,157718,157803,160740,160742,161840,161841,161933,161934,162197,162199,163483,163484,163840,163842,163904,163905,165079,165080,165396,165397,171849,171850,174575,174576,179915,179916,187495,187496,189449,189610,190300,196609,197114,216372,229376,229378,229440,229441,258044,260078,260085,260214") && block_image_verify("/dev/block/bootdevice/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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:45307210:dfec8fb9ed02920503d797e1378ef3cffa3b7f64",
                "EMMC:/dev/block/bootdevice/by-name/boot:45307210:9e6c32cd42e0002eb0ed8fbbd20062a7dd354990",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:45307210:9e6c32cd42e0002eb0ed8fbbd20062a7dd354990");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_a");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_b");
show_progress(0.600000, 600);
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.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_a");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_a");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_a");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_a");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_a");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_a");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_a");
package_extract_file("firmware-update/bluetooth.img", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_a");
package_extract_file("firmware-update/modem.img", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/dsp.img", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_a");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_a");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_a");
