getprop("ro.product.device") == "lotus" || abort("E3004: This package is for \"lotus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/lotus_ru/lotus:8.1.0/O11019/V11.0.6.0.OFIRUXM:user/release-keys");
ui_print("Target: xiaomi/lotus_ru/lotus:8.1.0/O11019/V11.0.9.0.OFIRUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/lotus_ru/lotus:8.1.0/O11019/V11.0.6.0.OFIRUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/lotus_ru/lotus:8.1.0/O11019/V11.0.9.0.OFIRUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/lotus_ru/lotus:8.1.0/O11019/V11.0.6.0.OFIRUXM:user/release-keys or xiaomi/lotus_ru/lotus:8.1.0/O11019/V11.0.9.0.OFIRUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:5f14e1b0459b5627ba847a37d7525dbed1be8402:33554432:2091532ced707e3f5da1f6bc444a357b6d5d0ddc", "5f14e1b0459b5627ba847a37d7525dbed1be8402", "2091532ced707e3f5da1f6bc444a357b6d5d0ddc") || abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:5f14e1b0459b5627ba847a37d7525dbed1be8402:33554432:2091532ced707e3f5da1f6bc444a357b6d5d0ddc\" has unexpected contents.");
apply_patch_space(121839616) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/platform/bootdevice/by-name/system", "216,1,462,696,704,2286,2288,2291,2293,2294,2296,2297,2298,2302,2303,2305,2306,2307,2308,2309,2310,2311,2312,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2327,2328,2329,2330,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2343,2344,2345,2346,2347,2349,2394,2395,2466,2467,2475,2476,2479,2480,2493,2494,2513,2514,2537,2538,2552,2553,2561,2562,2583,2586,2626,2628,2632,2633,2639,2640,2646,2648,2658,2660,2662,2664,2672,2673,2679,2680,4076,4077,4182,4184,4204,4205,4621,4687,4692,8688,9104,9170,9175,13171,13523,13524,13984,13985,18744,18746,20614,20615,20829,20830,21465,21466,25658,25659,26553,26554,32768,32770,32958,32959,35070,35071,46269,46270,46280,46299,47371,47380,47628,48094,48105,49627,49654,50982,51106,51793,51887,52173,52211,52627,52644,55626,55732,61217,61524,61589,63063,63119,64208,65537,66042,79539,80229,80242,80274,98306,98494,98495,99000,131073,131578,163842,164030,164031,164536,196609,197114,229378,229566,229567,230072,262145,262650,294914,295102,295103,295608,327681,328186,328187,344570,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,746484,753664,753665,774003,786268,786431,786432") == "110d3a315f9e5723f32c0c84628901dedeae84ae" || block_image_verify("/dev/block/platform/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/platform/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/system", "216,1,462,696,704,2286,2288,2291,2293,2294,2296,2297,2298,2302,2303,2305,2306,2307,2308,2309,2310,2311,2312,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2327,2328,2329,2330,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2343,2344,2345,2346,2347,2349,2394,2395,2466,2467,2475,2476,2479,2480,2493,2494,2513,2514,2537,2538,2552,2553,2561,2562,2583,2586,2626,2628,2632,2633,2639,2640,2646,2648,2658,2660,2662,2664,2672,2673,2679,2680,4076,4077,4182,4184,4204,4205,4621,4687,4692,8688,9104,9170,9175,13171,13523,13524,13984,13985,18744,18746,20614,20615,20829,20830,21465,21466,25658,25659,26553,26554,32768,32770,32958,32959,35070,35071,46269,46270,46280,46299,47371,47380,47628,48094,48105,49627,49654,50982,51106,51793,51887,52173,52211,52627,52644,55626,55732,61217,61524,61589,63063,63119,64208,65537,66042,79539,80229,80242,80274,98306,98494,98495,99000,131073,131578,163842,164030,164031,164536,196609,197114,229378,229566,229567,230072,262145,262650,294914,295102,295103,295608,327681,328186,328187,344570,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,746484,753664,753665,774003,786268,786431,786432") && block_image_verify("/dev/block/platform/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/platform/bootdevice/by-name/vendor", "170,1,153,555,564,822,823,848,852,861,862,1819,1820,2701,2702,6673,6674,6694,6695,6703,6705,6708,6711,8660,8661,9248,9250,9308,9309,9326,9327,9333,9334,9339,9340,9344,9345,9420,9421,9431,9432,9674,9675,9688,9689,9696,9697,15827,15828,19055,19056,29533,29534,32768,32770,32817,32818,36940,36941,40462,40463,42944,42945,50384,50385,50639,50640,50736,51037,55343,55344,57741,57742,60232,60233,60254,60255,61810,61816,62353,62354,62375,62376,62390,62391,64212,64213,64214,64217,64256,64258,64279,64280,64313,64314,64316,64317,64339,64340,64363,64364,64380,64381,64438,64439,64474,64477,65536,65537,66042,66043,71053,71054,75756,75757,75770,75772,75779,75780,75964,75965,76398,76399,76594,76595,76613,76614,76936,76937,76968,76969,76978,76979,76983,76985,79837,79838,80842,80843,86463,86464,89876,89877,98304,98306,98353,98354,99341,99342,102379,102380,102437,102438,104674,104675,108975,108976,109000,109001,110313,110314,110406,110410,163840,163842,163889,163890,193485,196553,196607,196608") == "4217ba0456c5b1ecf4358298bdbb5fa22d3a7ebc" || block_image_verify("/dev/block/platform/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/platform/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/vendor", "170,1,153,555,564,822,823,848,852,861,862,1819,1820,2701,2702,6673,6674,6694,6695,6703,6705,6708,6711,8660,8661,9248,9250,9308,9309,9326,9327,9333,9334,9339,9340,9344,9345,9420,9421,9431,9432,9674,9675,9688,9689,9696,9697,15827,15828,19055,19056,29533,29534,32768,32770,32817,32818,36940,36941,40462,40463,42944,42945,50384,50385,50639,50640,50736,51037,55343,55344,57741,57742,60232,60233,60254,60255,61810,61816,62353,62354,62375,62376,62390,62391,64212,64213,64214,64217,64256,64258,64279,64280,64313,64314,64316,64317,64339,64340,64363,64364,64380,64381,64438,64439,64474,64477,65536,65537,66042,66043,71053,71054,75756,75757,75770,75772,75779,75780,75964,75965,76398,76399,76594,76595,76613,76614,76936,76937,76968,76969,76978,76979,76983,76985,79837,79838,80842,80843,86463,86464,89876,89877,98304,98306,98353,98354,99341,99342,102379,102380,102437,102438,104674,104675,108975,108976,109000,109001,110313,110314,110406,110410,163840,163842,163889,163890,193485,196553,196607,196608") && block_image_verify("/dev/block/platform/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);
apply_patch("EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:5f14e1b0459b5627ba847a37d7525dbed1be8402:33554432:2091532ced707e3f5da1f6bc444a357b6d5d0ddc",
            "-", 2091532ced707e3f5da1f6bc444a357b6d5d0ddc, 33554432,
            5f14e1b0459b5627ba847a37d7525dbed1be8402, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/platform/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/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_mtupdate_stage("/cache/recovery/last_mtupdate_stage");
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "1") ,
(
ui_print("start to update general image");
package_extract_file("logo.bin", "/dev/block/platform/bootdevice/by-name/logo");
package_extract_file("md1img.img", "/dev/block/platform/bootdevice/by-name/md1img");
package_extract_file("spmfw.img", "/dev/block/platform/bootdevice/by-name/spmfw");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "1");
),
ui_print("general images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "3") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "2") then

ui_print("start to update alt loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_2");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee2");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk2");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp2");
assert(set_emmc_writable("/sys/block/mmcblk0boot1/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot1"));
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "2");
endif;

switch_active("sspm_1", "sspm_2");
switch_active("tee1", "tee2");
switch_active("lk", "lk2");
switch_active("scp1", "scp2");
switch_active("preloader", "preloader2");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "3");
),
ui_print("alt loder images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "5") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "4") then

ui_print("start to update main loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_1");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee1");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp1");
assert(set_emmc_writable("/sys/block/mmcblk0boot0/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot0"));
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "4");
endif;

switch_active("sspm_2", "sspm_1");
switch_active("tee2", "tee1");
switch_active("lk2", "lk");
switch_active("scp2", "scp1");
switch_active("preloader2", "preloader");
),
ui_print("main loader images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "6") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "5") then

ui_print("start to update vbmeta and odmdtbo image");
package_extract_file("vbmeta.img", "/dev/block/platform/bootdevice/by-name/vbmeta");
package_extract_file("odmdtbo.img", "/dev/block/platform/bootdevice/by-name/odmdtbo");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "5");
endif;

),
ui_print("vbmeta and odmdtbo images are already updated");
);
delete("/cache/recovery/last_mtupdate_stage");
show_progress(0.100000, 2);
