getprop("ro.product.device") == "lavender" || abort("E3004: This package is for \"lavender\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/lavender/lavender:10/QKQ1.190910.002/V11.0.4.0.QFGINXM:user/release-keys");
ui_print("Target: xiaomi/lavender/lavender:10/QKQ1.190910.002/V11.0.5.0.QFGINXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/lavender/lavender:10/QKQ1.190910.002/V11.0.4.0.QFGINXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/lavender/lavender:10/QKQ1.190910.002/V11.0.5.0.QFGINXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/lavender/lavender:10/QKQ1.190910.002/V11.0.4.0.QFGINXM:user/release-keys or xiaomi/lavender/lavender:10/QKQ1.190910.002/V11.0.5.0.QFGINXM: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:67108864:c1ad4077bbdc3ee96f09d5837fc53daff592c3c4",
                      "EMMC:/dev/block/bootdevice/by-name/boot:67108864:71a268e97779716c8e5b5a4762624968145517a6") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:c1ad4077bbdc3ee96f09d5837fc53daff592c3c4\" or \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:71a268e97779716c8e5b5a4762624968145517a6\" has unexpected contents.");
apply_patch_space(100499456) || 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", "636,1,655,728,742,771,778,831,1097,1099,1100,1206,1207,1691,1692,2380,2381,2383,2385,2386,2387,2402,2403,2584,2585,2629,2772,3754,3755,3757,3758,3762,3763,3771,3772,3773,3774,9131,9132,9134,9135,9539,9540,9542,9543,9765,10452,10539,10541,16480,16481,16614,16615,19384,32770,32990,32991,33496,35198,35208,35219,35226,35250,35256,36331,36341,36356,36362,37579,37613,37622,37628,37636,37642,37764,37772,39913,39944,39977,39983,40083,40089,42369,42398,42414,42420,45706,45749,46122,46132,46236,46243,46504,46512,46643,46651,47057,47074,51694,51790,51798,51804,52493,52517,56445,56452,56688,56696,57890,57918,58343,58349,60107,60152,60159,60165,60190,60216,62478,62510,62582,62588,62674,62682,65537,66042,74026,76190,76468,76482,76517,76541,76994,77399,78084,78102,80374,80423,80820,80835,87385,87453,88381,88408,96785,96910,98306,98526,98527,99032,99624,99632,99678,99685,99764,99770,99819,99826,102722,102742,105788,105796,106149,106165,106773,106791,106792,126592,126594,126798,126818,126824,126837,126846,130825,130891,131073,131578,132404,132428,132482,132489,132497,132504,135309,135358,135444,135452,135457,135463,135510,135516,136255,136274,136644,136656,137475,137500,137540,137546,139456,139482,139556,139563,139636,139643,139680,139686,139790,139798,140788,140815,146667,146759,146770,146776,146914,146922,148391,148409,149662,149680,150576,150605,150612,150618,150643,150649,150656,150666,150684,150690,150717,150723,153719,153769,154040,154052,154409,154420,155912,155924,156856,157749,158171,158185,159455,159467,161918,161935,162424,162434,163842,164062,164063,164568,165793,165800,173201,173219,173220,177808,177809,180207,180298,180402,182304,182309,182310,182315,182316,182320,182323,182325,182327,182346,183131,183134,183137,183138,183154,183160,183217,183222,183245,183251,183328,183337,183926,183939,184627,184628,196609,197114,229378,229598,229599,230104,262145,262650,282106,282686,282697,283114,283115,283780,283792,283838,283861,284146,291839,291933,293669,293684,294914,295134,295135,295640,327681,328186,360449,360954,374189,374331,393217,393722,425985,426490,441073,441084,444479,444527,444588,444594,444674,444681,450063,450149,450349,450359,450368,450374,455055,455107,456119,456143,456202,456209,458753,459258,461970,461981,462109,462119,462748,462765,465365,465432,465443,465449,465465,465471,465848,465861,465871,465881,468086,468134,477028,477054,477086,477092,477562,477573,479049,479069,482841,482875,483517,483530,483628,483637,483696,483703,483711,483717,485535,485553,485680,485688,485689,491520,491521,511566,514260,514328,519679,519706,522570,522634,522635,523170,524289,524794,530782,530788,531060,531529,531911,532411,532729,532896,537038,537040,537198,537212,537222,537224,537231,537236,537285,537287,537290,537291,537304,537307,537319,537321,537322,537326,537337,537338,537349,537359,537361,537377,537378,537419,537435,537477,537479,537484,537488,537490,537499,537503,537506,537568,537570,537599,537614,537617,537618,537623,537625,537627,537679,537682,537699,537728,540805,540891,543483,545984,552531,552659,557057,557562,560311,560357,569412,572562,580146,580217,580237,580243,580283,580289,580319,580325,580338,580344,580364,580370,580375,580381,582081,582091,582098,582104,582168,582175,582176,582183,589825,590330,591944,592014,592089,592188,592195,592201,592293,592300,594245,594273,594291,594297,598796,598825,600471,601643,601801,601808,601819,601825,601869,601875,607372,607441,607470,607477,608800,608826,609391,609413,609501,609509,609838,609854,609875,609881,614153,616275,616276,618408,618418,618424,619143,619152,619161,619167,622593,623098,626555,627327,627694,628203,628218,628224,655361,655866,664215,664227,664242,664248,664257,664263,664289,664295,688129,688634,709254,709260,709272,709279,709288,709294,709307,709313,712430,712436,712492,712498,712520,712526,712546,712552,712866,713081,713082,713297,720897,721402,729180,729192,729238,729244,732042,732060,753665,754170,757364,757412,757586,757595,757638,757645,757769,757778,759029,759060,760112,760123,786433,786938,790971,796752,797244,797260,800029,800047,802357,802383,819202,819422,819423,819928,840667,840673,843242,843248,843530,843540,843543,843549,843573,843580,851969,852474,858579,884736,884738,884958,884959,903007,916968") == "61ab878f186accb51847722da549bf0b9edbae95" || 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", "636,1,655,728,742,771,778,831,1097,1099,1100,1206,1207,1691,1692,2380,2381,2383,2385,2386,2387,2402,2403,2584,2585,2629,2772,3754,3755,3757,3758,3762,3763,3771,3772,3773,3774,9131,9132,9134,9135,9539,9540,9542,9543,9765,10452,10539,10541,16480,16481,16614,16615,19384,32770,32990,32991,33496,35198,35208,35219,35226,35250,35256,36331,36341,36356,36362,37579,37613,37622,37628,37636,37642,37764,37772,39913,39944,39977,39983,40083,40089,42369,42398,42414,42420,45706,45749,46122,46132,46236,46243,46504,46512,46643,46651,47057,47074,51694,51790,51798,51804,52493,52517,56445,56452,56688,56696,57890,57918,58343,58349,60107,60152,60159,60165,60190,60216,62478,62510,62582,62588,62674,62682,65537,66042,74026,76190,76468,76482,76517,76541,76994,77399,78084,78102,80374,80423,80820,80835,87385,87453,88381,88408,96785,96910,98306,98526,98527,99032,99624,99632,99678,99685,99764,99770,99819,99826,102722,102742,105788,105796,106149,106165,106773,106791,106792,126592,126594,126798,126818,126824,126837,126846,130825,130891,131073,131578,132404,132428,132482,132489,132497,132504,135309,135358,135444,135452,135457,135463,135510,135516,136255,136274,136644,136656,137475,137500,137540,137546,139456,139482,139556,139563,139636,139643,139680,139686,139790,139798,140788,140815,146667,146759,146770,146776,146914,146922,148391,148409,149662,149680,150576,150605,150612,150618,150643,150649,150656,150666,150684,150690,150717,150723,153719,153769,154040,154052,154409,154420,155912,155924,156856,157749,158171,158185,159455,159467,161918,161935,162424,162434,163842,164062,164063,164568,165793,165800,173201,173219,173220,177808,177809,180207,180298,180402,182304,182309,182310,182315,182316,182320,182323,182325,182327,182346,183131,183134,183137,183138,183154,183160,183217,183222,183245,183251,183328,183337,183926,183939,184627,184628,196609,197114,229378,229598,229599,230104,262145,262650,282106,282686,282697,283114,283115,283780,283792,283838,283861,284146,291839,291933,293669,293684,294914,295134,295135,295640,327681,328186,360449,360954,374189,374331,393217,393722,425985,426490,441073,441084,444479,444527,444588,444594,444674,444681,450063,450149,450349,450359,450368,450374,455055,455107,456119,456143,456202,456209,458753,459258,461970,461981,462109,462119,462748,462765,465365,465432,465443,465449,465465,465471,465848,465861,465871,465881,468086,468134,477028,477054,477086,477092,477562,477573,479049,479069,482841,482875,483517,483530,483628,483637,483696,483703,483711,483717,485535,485553,485680,485688,485689,491520,491521,511566,514260,514328,519679,519706,522570,522634,522635,523170,524289,524794,530782,530788,531060,531529,531911,532411,532729,532896,537038,537040,537198,537212,537222,537224,537231,537236,537285,537287,537290,537291,537304,537307,537319,537321,537322,537326,537337,537338,537349,537359,537361,537377,537378,537419,537435,537477,537479,537484,537488,537490,537499,537503,537506,537568,537570,537599,537614,537617,537618,537623,537625,537627,537679,537682,537699,537728,540805,540891,543483,545984,552531,552659,557057,557562,560311,560357,569412,572562,580146,580217,580237,580243,580283,580289,580319,580325,580338,580344,580364,580370,580375,580381,582081,582091,582098,582104,582168,582175,582176,582183,589825,590330,591944,592014,592089,592188,592195,592201,592293,592300,594245,594273,594291,594297,598796,598825,600471,601643,601801,601808,601819,601825,601869,601875,607372,607441,607470,607477,608800,608826,609391,609413,609501,609509,609838,609854,609875,609881,614153,616275,616276,618408,618418,618424,619143,619152,619161,619167,622593,623098,626555,627327,627694,628203,628218,628224,655361,655866,664215,664227,664242,664248,664257,664263,664289,664295,688129,688634,709254,709260,709272,709279,709288,709294,709307,709313,712430,712436,712492,712498,712520,712526,712546,712552,712866,713081,713082,713297,720897,721402,729180,729192,729238,729244,732042,732060,753665,754170,757364,757412,757586,757595,757638,757645,757769,757778,759029,759060,760112,760123,786433,786938,790971,796752,797244,797260,800029,800047,802357,802383,819202,819422,819423,819928,840667,840673,843242,843248,843530,843540,843543,843549,843573,843580,851969,852474,858579,884736,884738,884958,884959,903007,916968") && 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", "52,1,366,633,641,651,653,660,744,751,1021,1028,1086,1093,1139,1145,1160,1166,1172,1178,32770,32895,32896,33401,65537,66042,98306,98431,98432,98937,131073,131578,163842,163967,163968,164473,196609,197114,227747,227753,229378,229503,229504,230009,233929,294912,294914,491520,491521,515995,524173,524287,524288") == "12c9fc4e9cc7df8a531c2a19ae061748879e14b7" || 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", "52,1,366,633,641,651,653,660,744,751,1021,1028,1086,1093,1139,1145,1160,1166,1172,1178,32770,32895,32896,33401,65537,66042,98306,98431,98432,98937,131073,131578,163842,163967,163968,164473,196609,197114,227747,227753,229378,229503,229504,230009,233929,294912,294914,491520,491521,515995,524173,524287,524288") && 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:67108864:c1ad4077bbdc3ee96f09d5837fc53daff592c3c4",
                "EMMC:/dev/block/bootdevice/by-name/boot:67108864:71a268e97779716c8e5b5a4762624968145517a6",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:67108864:71a268e97779716c8e5b5a4762624968145517a6");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/mdtpsecapp.mbn", "/dev/block/bootdevice/by-name/mdtpsecapp");
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/pmic.elf", "/dev/block/bootdevice/by-name/pmic");
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/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
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/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
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/pmic.elf", "/dev/block/bootdevice/by-name/pmicbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
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/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
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");
