getprop("ro.product.device") == "pyxis" || abort("E3004: This package is for \"pyxis\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.3.0.QFCEUXM:user/release-keys");
ui_print("Target: Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.4.0.QFCEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.3.0.QFCEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.4.0.QFCEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.3.0.QFCEUXM:user/release-keys or Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.4.0.QFCEUXM: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:134217728:173d7c56e2d9f767435b08824896729952aa996b",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:db9b535b941e5e1ce6715ca88f3d93361f21f21c") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:173d7c56e2d9f767435b08824896729952aa996b\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:db9b535b941e5e1ce6715ca88f3d93361f21f21c\" has unexpected contents.");
apply_patch_space(134217728) || 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", "348,1,573,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2522,2566,2709,3691,3692,3694,3695,3699,3700,3708,3709,3710,3711,9068,9069,9071,9072,9476,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,25589,25591,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,34957,35025,35026,35040,35041,35053,35054,35672,35675,35686,35687,35693,35694,35699,35700,35819,35822,37436,37437,39648,39649,39680,39681,39893,39894,39993,41408,43220,43221,43234,43235,43240,43241,43243,43244,45704,45705,46075,46076,46130,46133,46220,46221,46412,46413,49098,49099,49102,49103,49412,49413,53104,53105,53266,53267,53687,53688,54594,54595,54599,54600,54622,54623,55843,55844,56244,56245,56281,56282,59589,59591,63377,63378,63565,63566,64868,64869,65007,65008,65040,65041,65491,65492,65536,65537,66681,66682,67911,67912,68088,68089,69903,69904,72389,72390,72875,72876,77179,77180,79855,79856,81035,81036,81108,81109,81128,81131,84426,84427,87050,87051,87841,87842,87988,87989,88649,88650,88662,88663,88667,88668,89009,89012,89022,89023,94620,94621,96269,96270,96321,96322,96325,96328,98184,98185,98269,98270,98272,98273,98294,98295,98304,98306,98526,98527,99962,99965,100365,100368,100534,100535,100576,100577,102561,102562,102612,102613,102963,102964,103036,103037,103653,103654,107806,107807,107812,107813,108208,108209,109690,109691,111235,111236,111684,111685,111689,111690,111698,111699,111703,111704,111715,111716,111739,111740,113637,113638,113776,113777,114056,114059,114587,114588,115513,115514,116084,116085,116351,116354,118644,118645,118858,118859,121488,121489,121501,121502,121843,121844,123094,123179,123590,123591,124026,124027,125764,125765,128512,131073,131578,163842,164062,164063,164568,196609,197114,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,871753,884736,884738,884958,884959,903007,917316,917503,917504") == "9d12a40466164de954dd3762b6b5ba3aedeb82f4" || 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", "348,1,573,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2522,2566,2709,3691,3692,3694,3695,3699,3700,3708,3709,3710,3711,9068,9069,9071,9072,9476,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,25589,25591,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,34957,35025,35026,35040,35041,35053,35054,35672,35675,35686,35687,35693,35694,35699,35700,35819,35822,37436,37437,39648,39649,39680,39681,39893,39894,39993,41408,43220,43221,43234,43235,43240,43241,43243,43244,45704,45705,46075,46076,46130,46133,46220,46221,46412,46413,49098,49099,49102,49103,49412,49413,53104,53105,53266,53267,53687,53688,54594,54595,54599,54600,54622,54623,55843,55844,56244,56245,56281,56282,59589,59591,63377,63378,63565,63566,64868,64869,65007,65008,65040,65041,65491,65492,65536,65537,66681,66682,67911,67912,68088,68089,69903,69904,72389,72390,72875,72876,77179,77180,79855,79856,81035,81036,81108,81109,81128,81131,84426,84427,87050,87051,87841,87842,87988,87989,88649,88650,88662,88663,88667,88668,89009,89012,89022,89023,94620,94621,96269,96270,96321,96322,96325,96328,98184,98185,98269,98270,98272,98273,98294,98295,98304,98306,98526,98527,99962,99965,100365,100368,100534,100535,100576,100577,102561,102562,102612,102613,102963,102964,103036,103037,103653,103654,107806,107807,107812,107813,108208,108209,109690,109691,111235,111236,111684,111685,111689,111690,111698,111699,111703,111704,111715,111716,111739,111740,113637,113638,113776,113777,114056,114059,114587,114588,115513,115514,116084,116085,116351,116354,118644,118645,118858,118859,121488,121489,121501,121502,121843,121844,123094,123179,123590,123591,124026,124027,125764,125765,128512,131073,131578,163842,164062,164063,164568,196609,197114,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,871753,884736,884738,884958,884959,903007,917316,917503,917504") && 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", "198,1,256,602,610,620,621,702,703,767,768,770,771,773,784,789,790,792,793,801,802,1348,1349,1401,1441,4353,4354,4509,4510,5202,5203,5884,5885,6816,6821,9074,9075,10724,10725,11996,11997,32768,32770,32864,32865,33809,33811,41419,41420,46092,46093,49172,49173,65536,65537,66043,66044,68527,68528,81060,81061,85035,85036,97705,97706,98304,98306,98400,98401,103064,103065,110009,110010,111015,111017,111033,111035,111455,111456,111538,111539,120505,120508,120526,120527,120572,120573,120591,120592,120593,120594,120642,120643,120692,120693,121493,121494,121507,121508,121545,121546,121729,121730,121976,121977,121987,121988,127442,127444,131072,131073,134086,134087,134089,134090,134285,134479,134665,134667,134706,134707,139601,139602,142631,142632,142633,142634,142655,142656,143080,143081,143133,143134,143460,143462,143463,143469,143483,143485,143491,143502,143526,143530,143668,143669,154741,154742,159766,159767,160689,160690,161783,161785,162800,162801,163652,163842,163936,163937,164442,165056,174542,174543,195689,195690,196608,196609,200556,200718,225177,225178,229376,229378,229472,229473,232868,232898,235888,235889,237055,237056,237078,237079,237852,262145,262650,294914,295008,295009,295514,327681,328186,355229,360448,360449,386991,393125,393215,393216") == "9a93110ad677489a5ba02af9955cac587921aba0" || 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", "198,1,256,602,610,620,621,702,703,767,768,770,771,773,784,789,790,792,793,801,802,1348,1349,1401,1441,4353,4354,4509,4510,5202,5203,5884,5885,6816,6821,9074,9075,10724,10725,11996,11997,32768,32770,32864,32865,33809,33811,41419,41420,46092,46093,49172,49173,65536,65537,66043,66044,68527,68528,81060,81061,85035,85036,97705,97706,98304,98306,98400,98401,103064,103065,110009,110010,111015,111017,111033,111035,111455,111456,111538,111539,120505,120508,120526,120527,120572,120573,120591,120592,120593,120594,120642,120643,120692,120693,121493,121494,121507,121508,121545,121546,121729,121730,121976,121977,121987,121988,127442,127444,131072,131073,134086,134087,134089,134090,134285,134479,134665,134667,134706,134707,139601,139602,142631,142632,142633,142634,142655,142656,143080,143081,143133,143134,143460,143462,143463,143469,143483,143485,143491,143502,143526,143530,143668,143669,154741,154742,159766,159767,160689,160690,161783,161785,162800,162801,163652,163842,163936,163937,164442,165056,174542,174543,195689,195690,196608,196609,200556,200718,225177,225178,229376,229378,229472,229473,232868,232898,235888,235889,237055,237056,237078,237079,237852,262145,262650,294914,295008,295009,295514,327681,328186,355229,360448,360449,386991,393125,393215,393216") && 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:134217728:173d7c56e2d9f767435b08824896729952aa996b",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:db9b535b941e5e1ce6715ca88f3d93361f21f21c",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:db9b535b941e5e1ce6715ca88f3d93361f21f21c");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/logfs_ufs_8mb.bin", "/dev/block/bootdevice/by-name/logfs");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
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/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/logo.img", "/dev/block/bootdevice/by-name/logo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
