getprop("ro.product.device") == "raphael" || abort("E3004: This package is for \"raphael\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/raphael/raphael:10/QKQ1.190825.002/V11.0.3.0.QFKMIXM:user/release-keys");
ui_print("Target: Xiaomi/raphael/raphael:10/QKQ1.190825.002/V11.0.4.0.QFKMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:10/QKQ1.190825.002/V11.0.3.0.QFKMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:10/QKQ1.190825.002/V11.0.4.0.QFKMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/raphael/raphael:10/QKQ1.190825.002/V11.0.3.0.QFKMIXM:user/release-keys or Xiaomi/raphael/raphael:10/QKQ1.190825.002/V11.0.4.0.QFKMIXM: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:f61f83b1df654d7062befa8a6092a3fb537bf1ea",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:d13aec25d0b4135c7bf0c80d881a773a898587be") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:f61f83b1df654d7062befa8a6092a3fb537bf1ea\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:d13aec25d0b4135c7bf0c80d881a773a898587be\" 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", "652,1,655,728,742,774,781,783,784,1030,1035,1037,1038,1144,1145,1630,1631,2319,2320,2322,2324,2325,2326,2341,2342,2523,2524,3017,3176,3695,3696,3698,3699,3703,3704,3712,3713,3714,3715,4332,4455,5818,5935,9072,9073,9075,9076,9480,9481,9483,9484,10480,10482,16421,16422,16555,16556,19325,19327,25594,25596,32768,32770,32990,32991,34761,34762,34764,34766,34825,34826,34959,34961,35084,35088,35095,35096,35108,35112,35116,36304,36308,36309,36319,36329,36335,36339,36343,36344,36349,36353,36357,36358,36475,36481,36487,36488,37808,37812,37830,37831,40042,40043,40073,40077,40081,40082,40293,40297,40305,41818,43432,43436,43457,43458,43471,43475,43479,43480,43482,43483,46316,46320,46348,46349,46719,46723,46731,46732,46830,46836,46841,46842,46970,46974,46980,46981,47243,47244,47437,47441,47456,47457,51924,51928,52013,52014,52019,52023,52027,52028,52695,52699,52721,52722,56413,56414,56575,56576,57070,57074,57078,57079,58317,58321,58356,58357,58361,58365,58369,58370,58392,58396,58420,58421,60680,60684,60714,60715,60778,60782,60786,60787,60870,60874,60880,60881,65490,65492,65536,65537,67062,67063,70606,70607,70794,70798,70803,70941,72243,72247,72281,73915,74202,74206,74218,74219,74229,74233,74237,74238,74270,74274,74278,74279,74280,74281,74290,74291,74296,74297,74979,74983,74999,75000,75010,75014,75018,75019,77003,77007,77050,77051,77439,77443,77456,77457,80254,80255,83746,83750,83816,83817,84406,84410,84427,84428,91571,91575,91655,91656,93639,93643,93649,93650,93693,93697,93702,93703,93777,93781,93785,93786,93830,93836,93841,93842,96453,96457,96474,96475,97973,97974,98043,98044,98304,98306,98526,98527,99114,99118,99124,99125,99465,99469,99482,99483,99844,99845,100084,100088,100104,100105,115210,115214,115359,115360,115748,115754,115768,115769,115779,115783,115790,115791,119399,119403,119455,119456,119830,119834,119847,119848,119899,119903,119908,119909,119912,119918,119923,119924,122698,122702,122748,122749,122832,122836,122842,122843,122845,122849,122853,122854,122898,122902,122906,122907,123608,123614,123631,123632,123996,124002,124012,124013,124209,124213,124218,124219,124873,124879,124902,124903,124941,124945,124949,124950,126832,126836,126860,126861,126931,126935,126940,126941,127678,127682,127700,127701,127712,127716,127720,127721,127821,127825,127831,127832,128912,128916,128941,128942,131072,131073,135297,135301,135391,135392,135400,135404,135408,135409,135544,135548,135554,135555,137021,137025,137041,137042,137053,137057,137061,137062,138322,138328,138344,138345,139238,139242,139269,139270,139274,139278,139282,139283,139297,139301,139305,139306,139310,139314,139317,139318,139322,139323,139338,139342,139346,139347,139749,139753,139758,139759,139783,139787,139791,139792,142334,142338,142382,142383,142386,142390,142394,142395,142659,142663,142673,142674,143020,143026,143035,143036,143062,143068,143073,143074,143992,143996,144015,144818,146074,146078,146105,146106,146502,146506,146518,146521,148565,148569,148584,148585,149071,149075,149083,149084,151488,151493,151510,151511,151850,151851,153436,153445,153761,153762,154195,154196,155938,155939,158464,158469,158475,158476,158784,158785,158796,158797,158807,158810,158811,158812,158813,158814,158816,158817,158818,158819,158856,158857,158863,158864,158950,158953,158955,158956,160063,160064,160304,160305,160311,160312,160335,160336,160404,160405,160408,160413,160414,160415,160416,160417,160418,160419,161198,161199,161205,161206,161669,161671,162134,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162150,162151,162152,162155,162822,162824,162905,162906,162908,162909,162912,162914,163172,163173,163180,163182,163668,163670,163792,163793,163804,163805,163840,163842,164062,164063,164799,164800,164913,164914,164930,164932,164934,164935,173857,173858,181821,181822,183725,183726,184196,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,884738,884958,884959,885464,886737,903007,917316,917503,917504") == "0b379b89c5900bb3b45f5e1d4e89d691d6be5d66" || 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", "652,1,655,728,742,774,781,783,784,1030,1035,1037,1038,1144,1145,1630,1631,2319,2320,2322,2324,2325,2326,2341,2342,2523,2524,3017,3176,3695,3696,3698,3699,3703,3704,3712,3713,3714,3715,4332,4455,5818,5935,9072,9073,9075,9076,9480,9481,9483,9484,10480,10482,16421,16422,16555,16556,19325,19327,25594,25596,32768,32770,32990,32991,34761,34762,34764,34766,34825,34826,34959,34961,35084,35088,35095,35096,35108,35112,35116,36304,36308,36309,36319,36329,36335,36339,36343,36344,36349,36353,36357,36358,36475,36481,36487,36488,37808,37812,37830,37831,40042,40043,40073,40077,40081,40082,40293,40297,40305,41818,43432,43436,43457,43458,43471,43475,43479,43480,43482,43483,46316,46320,46348,46349,46719,46723,46731,46732,46830,46836,46841,46842,46970,46974,46980,46981,47243,47244,47437,47441,47456,47457,51924,51928,52013,52014,52019,52023,52027,52028,52695,52699,52721,52722,56413,56414,56575,56576,57070,57074,57078,57079,58317,58321,58356,58357,58361,58365,58369,58370,58392,58396,58420,58421,60680,60684,60714,60715,60778,60782,60786,60787,60870,60874,60880,60881,65490,65492,65536,65537,67062,67063,70606,70607,70794,70798,70803,70941,72243,72247,72281,73915,74202,74206,74218,74219,74229,74233,74237,74238,74270,74274,74278,74279,74280,74281,74290,74291,74296,74297,74979,74983,74999,75000,75010,75014,75018,75019,77003,77007,77050,77051,77439,77443,77456,77457,80254,80255,83746,83750,83816,83817,84406,84410,84427,84428,91571,91575,91655,91656,93639,93643,93649,93650,93693,93697,93702,93703,93777,93781,93785,93786,93830,93836,93841,93842,96453,96457,96474,96475,97973,97974,98043,98044,98304,98306,98526,98527,99114,99118,99124,99125,99465,99469,99482,99483,99844,99845,100084,100088,100104,100105,115210,115214,115359,115360,115748,115754,115768,115769,115779,115783,115790,115791,119399,119403,119455,119456,119830,119834,119847,119848,119899,119903,119908,119909,119912,119918,119923,119924,122698,122702,122748,122749,122832,122836,122842,122843,122845,122849,122853,122854,122898,122902,122906,122907,123608,123614,123631,123632,123996,124002,124012,124013,124209,124213,124218,124219,124873,124879,124902,124903,124941,124945,124949,124950,126832,126836,126860,126861,126931,126935,126940,126941,127678,127682,127700,127701,127712,127716,127720,127721,127821,127825,127831,127832,128912,128916,128941,128942,131072,131073,135297,135301,135391,135392,135400,135404,135408,135409,135544,135548,135554,135555,137021,137025,137041,137042,137053,137057,137061,137062,138322,138328,138344,138345,139238,139242,139269,139270,139274,139278,139282,139283,139297,139301,139305,139306,139310,139314,139317,139318,139322,139323,139338,139342,139346,139347,139749,139753,139758,139759,139783,139787,139791,139792,142334,142338,142382,142383,142386,142390,142394,142395,142659,142663,142673,142674,143020,143026,143035,143036,143062,143068,143073,143074,143992,143996,144015,144818,146074,146078,146105,146106,146502,146506,146518,146521,148565,148569,148584,148585,149071,149075,149083,149084,151488,151493,151510,151511,151850,151851,153436,153445,153761,153762,154195,154196,155938,155939,158464,158469,158475,158476,158784,158785,158796,158797,158807,158810,158811,158812,158813,158814,158816,158817,158818,158819,158856,158857,158863,158864,158950,158953,158955,158956,160063,160064,160304,160305,160311,160312,160335,160336,160404,160405,160408,160413,160414,160415,160416,160417,160418,160419,161198,161199,161205,161206,161669,161671,162134,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162150,162151,162152,162155,162822,162824,162905,162906,162908,162909,162912,162914,163172,163173,163180,163182,163668,163670,163792,163793,163804,163805,163840,163842,164062,164063,164799,164800,164913,164914,164930,164932,164934,164935,173857,173858,181821,181822,183725,183726,184196,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,884738,884958,884959,885464,886737,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", "70,1,274,602,610,620,624,629,630,711,715,720,721,982,986,991,1002,1005,1009,1013,1014,1022,1026,1031,1036,1048,1049,1525,1575,1594,1899,1965,1966,2016,32770,32864,32865,33370,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,360449,360954,364850,386991,393125,393215,393216") == "830641f16fd11ca8d00c010b5590539665adba9f" || 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", "70,1,274,602,610,620,624,629,630,711,715,720,721,982,986,991,1002,1005,1009,1013,1014,1022,1026,1031,1036,1048,1049,1525,1575,1594,1899,1965,1966,2016,32770,32864,32865,33370,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,360449,360954,364850,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:f61f83b1df654d7062befa8a6092a3fb537bf1ea",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:d13aec25d0b4135c7bf0c80d881a773a898587be",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:d13aec25d0b4135c7bf0c80d881a773a898587be");

# ---- 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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
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/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
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/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
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/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
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/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
