getprop("ro.product.device") == "toco" || abort("E3004: This package is for \"toco\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.4.0.QFNMIXM:user/release-keys");
ui_print("Target: Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.5.0.QFNMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.4.0.QFNMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.5.0.QFNMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.4.0.QFNMIXM:user/release-keys or Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.5.0.QFNMIXM: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:e6e9fa03acc82494c7feb393b63b002866d8299c",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:d15469ac83a361d00fb06034780b0b46998f7153") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:e6e9fa03acc82494c7feb393b63b002866d8299c\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:d15469ac83a361d00fb06034780b0b46998f7153\" 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(map_partition("system"), "114,1,186,219,228,230,231,477,481,493,494,513,514,1831,1832,2261,2262,26129,26130,27497,27498,32725,32726,32768,32770,32918,32940,32979,32981,33104,33108,33115,33116,33124,33128,33133,33134,33625,33629,33645,33646,33658,33662,33666,33667,34879,34885,34917,34918,34924,34930,34931,34932,34937,34943,34944,34945,35062,35068,35074,35075,36651,36652,36769,36770,36808,36809,36810,36811,37209,37213,37242,37243,38583,38584,38586,38587,38594,38595,38673,38674,40355,40356,40377,40378,40384,40386,40817,40818,40848,40854,40855,40856,41069,41073,41081,41082,41179,41185,41186,98306,98454,163842,163990,229378,229526,294914,295062,589832,589846,605269,607129,616751,616883,616884") == "d99dffcd311321332951afe33ee80d808d579adb" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "114,1,186,219,228,230,231,477,481,493,494,513,514,1831,1832,2261,2262,26129,26130,27497,27498,32725,32726,32768,32770,32918,32940,32979,32981,33104,33108,33115,33116,33124,33128,33133,33134,33625,33629,33645,33646,33658,33662,33666,33667,34879,34885,34917,34918,34924,34930,34931,34932,34937,34943,34944,34945,35062,35068,35074,35075,36651,36652,36769,36770,36808,36809,36810,36811,37209,37213,37242,37243,38583,38584,38586,38587,38594,38595,38673,38674,40355,40356,40377,40378,40384,40386,40817,40818,40848,40854,40855,40856,41069,41073,41081,41082,41179,41185,41186,98306,98454,163842,163990,229378,229526,294914,295062,589832,589846,605269,607129,616751,616883,616884") && block_image_verify(map_partition("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(map_partition("vendor"), "336,1,98,108,112,117,118,199,203,208,209,1915,1919,2397,2398,2659,2663,2667,2668,2670,2681,2703,2704,2740,2744,2794,2795,2807,2811,2815,2816,2819,2825,2826,2827,3150,3151,3156,3160,3173,3174,3182,3186,3190,3191,3758,4063,4140,4141,14661,14662,14777,14828,15422,15423,15427,15429,15432,15434,15437,15439,15442,15444,15447,15449,15452,15454,15458,15460,15461,15462,15464,15466,15467,15468,15470,15472,15473,15474,15482,15484,15485,15486,15488,15490,15491,15492,15496,15497,15501,15503,15506,15508,15511,15513,15516,15518,15521,15523,15524,15525,15534,15535,15536,15537,15558,15559,15560,15561,15566,15567,15571,15572,15576,15577,15581,15582,15587,15588,15592,15593,15594,15595,15598,15599,15600,15601,15604,15605,15606,15607,15959,15960,16980,16983,26676,26677,32768,32770,32836,32866,35784,35785,35838,35839,36547,36548,37553,37555,37572,37574,38023,38024,38099,38100,41655,41658,41675,41676,41713,41714,41723,41724,41726,41727,41775,41776,41822,41823,41829,41830,41855,41856,42837,42838,42995,42996,42998,43000,43061,43062,43064,43065,43129,43130,43198,43199,43201,43202,43265,43266,43335,43336,43338,43339,43402,43403,43472,43473,43539,43540,43542,43543,43604,43605,43607,43608,43668,43669,43671,43672,43733,43734,43736,43737,43797,43798,43800,43801,43862,43863,43865,43866,43871,43873,43877,43878,43950,43951,43953,43954,44017,44018,44020,44021,44085,44086,44088,44089,44152,44153,44222,44223,44289,44290,44292,44293,44354,44355,44357,44358,44418,44419,44421,44422,44483,44484,44486,44487,44547,44548,44550,44551,44612,44613,44615,44616,44620,44621,44684,44685,44753,44754,44756,44757,44820,44821,44823,44824,44888,44889,44891,44892,44958,44959,45025,45026,45028,45029,45090,45091,45093,45094,45154,45155,45157,45158,45219,45220,45222,45223,45283,45284,45286,45287,45348,45349,45351,45352,51985,51986,61888,61889,62233,62234,62235,62236,62277,62279,62284,62286,62431,62460,62820,98306,98372,163842,163908,229378,229444,262160,262166,270052,270981,275278,275346,275347") == "3a5b0842188310ec7e93d0a44d39787830235c89" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "336,1,98,108,112,117,118,199,203,208,209,1915,1919,2397,2398,2659,2663,2667,2668,2670,2681,2703,2704,2740,2744,2794,2795,2807,2811,2815,2816,2819,2825,2826,2827,3150,3151,3156,3160,3173,3174,3182,3186,3190,3191,3758,4063,4140,4141,14661,14662,14777,14828,15422,15423,15427,15429,15432,15434,15437,15439,15442,15444,15447,15449,15452,15454,15458,15460,15461,15462,15464,15466,15467,15468,15470,15472,15473,15474,15482,15484,15485,15486,15488,15490,15491,15492,15496,15497,15501,15503,15506,15508,15511,15513,15516,15518,15521,15523,15524,15525,15534,15535,15536,15537,15558,15559,15560,15561,15566,15567,15571,15572,15576,15577,15581,15582,15587,15588,15592,15593,15594,15595,15598,15599,15600,15601,15604,15605,15606,15607,15959,15960,16980,16983,26676,26677,32768,32770,32836,32866,35784,35785,35838,35839,36547,36548,37553,37555,37572,37574,38023,38024,38099,38100,41655,41658,41675,41676,41713,41714,41723,41724,41726,41727,41775,41776,41822,41823,41829,41830,41855,41856,42837,42838,42995,42996,42998,43000,43061,43062,43064,43065,43129,43130,43198,43199,43201,43202,43265,43266,43335,43336,43338,43339,43402,43403,43472,43473,43539,43540,43542,43543,43604,43605,43607,43608,43668,43669,43671,43672,43733,43734,43736,43737,43797,43798,43800,43801,43862,43863,43865,43866,43871,43873,43877,43878,43950,43951,43953,43954,44017,44018,44020,44021,44085,44086,44088,44089,44152,44153,44222,44223,44289,44290,44292,44293,44354,44355,44357,44358,44418,44419,44421,44422,44483,44484,44486,44487,44547,44548,44550,44551,44612,44613,44615,44616,44620,44621,44684,44685,44753,44754,44756,44757,44820,44821,44823,44824,44888,44889,44891,44892,44958,44959,45025,45026,45028,45029,45090,45091,45093,45094,45154,45155,45157,45158,45219,45220,45222,45223,45283,45284,45286,45287,45348,45349,45351,45352,51985,51986,61888,61889,62233,62234,62235,62236,62277,62279,62284,62286,62431,62460,62820,98306,98372,163842,163908,229378,229444,262160,262166,270052,270981,275278,275346,275347") && block_image_verify(map_partition("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;
if (range_sha1(map_partition("product"), "352,1,90,5380,5381,5396,5400,5404,5405,7956,7957,8260,8261,9489,9493,11488,11491,11495,11496,11534,11535,11542,11548,11549,11550,11556,11562,11563,11564,11624,11628,11633,11634,14391,14392,17863,17864,20260,20261,20624,20628,21135,21136,21148,21154,21155,21156,22996,23000,24437,24438,28450,28454,32441,32442,32768,32770,32839,32850,39413,39414,39819,39820,46985,46986,54988,54989,56478,56479,65536,65547,66194,66195,66881,66882,68838,68839,78122,78123,78129,78130,78136,78142,78143,78144,78272,78278,78279,78280,78292,78298,78299,78300,78303,78304,78310,78316,78317,78318,78341,78347,78348,78349,79193,79194,92614,92615,92646,92647,98304,98306,98375,98386,98387,98388,108447,108448,108958,108959,115342,115343,120095,120096,122347,122348,122535,122536,122547,122553,122554,122555,122565,122566,122571,122575,122580,122581,122587,122593,122594,122595,122607,122613,122614,122615,122625,122631,122632,122633,122635,122642,122648,122649,124406,124407,124413,124414,124548,124549,125757,125764,125818,125825,125830,125837,125862,125869,125889,125896,125914,125921,125937,125938,125980,125982,126158,126159,126160,126161,126162,126163,126164,126165,126202,126203,126204,126205,126210,126211,126482,126486,126490,126494,126495,126497,126502,126506,126507,126511,126512,126516,126517,126521,126522,126526,126527,126531,126532,126536,126537,126539,126546,126550,126551,126555,126556,126560,126561,126565,126566,126568,126569,126573,126574,126578,126579,126581,126582,126586,126587,126591,126592,126596,126597,126601,126602,126606,126607,126611,126612,126614,126618,126622,126623,126627,126628,126632,126633,126635,126636,126640,126641,126643,126644,126648,126649,126651,126652,126656,126657,126661,126662,126666,126667,126710,126713,126808,127676,127677,131072,131083,131229,131230,132084,132085,136778,136779,137966,137969,140861,140863,140873,140916,147449,147451,152343,152345,152346,152347,154320,154321,154327,154329,156340,156342,158469,158472,160534,160536,160538,160541,162028,162029,163840,163842,163911,163924,170318,170320,172907,172908,173115,173117,173543,173545,175462,175464,175634,175635,178467,178468,181979,181981,182026,182028,182326,182328,183588,183590,184667,184669,185129,185130,187402,187403,191035,191036,193668,193669,196608,196648,198572,198574,198592,229378,229447,262151,262155,282479,283337,287829,287899,287900") == "b912070ad38743cf9073e301da2a67ce8aa6eca5" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "352,1,90,5380,5381,5396,5400,5404,5405,7956,7957,8260,8261,9489,9493,11488,11491,11495,11496,11534,11535,11542,11548,11549,11550,11556,11562,11563,11564,11624,11628,11633,11634,14391,14392,17863,17864,20260,20261,20624,20628,21135,21136,21148,21154,21155,21156,22996,23000,24437,24438,28450,28454,32441,32442,32768,32770,32839,32850,39413,39414,39819,39820,46985,46986,54988,54989,56478,56479,65536,65547,66194,66195,66881,66882,68838,68839,78122,78123,78129,78130,78136,78142,78143,78144,78272,78278,78279,78280,78292,78298,78299,78300,78303,78304,78310,78316,78317,78318,78341,78347,78348,78349,79193,79194,92614,92615,92646,92647,98304,98306,98375,98386,98387,98388,108447,108448,108958,108959,115342,115343,120095,120096,122347,122348,122535,122536,122547,122553,122554,122555,122565,122566,122571,122575,122580,122581,122587,122593,122594,122595,122607,122613,122614,122615,122625,122631,122632,122633,122635,122642,122648,122649,124406,124407,124413,124414,124548,124549,125757,125764,125818,125825,125830,125837,125862,125869,125889,125896,125914,125921,125937,125938,125980,125982,126158,126159,126160,126161,126162,126163,126164,126165,126202,126203,126204,126205,126210,126211,126482,126486,126490,126494,126495,126497,126502,126506,126507,126511,126512,126516,126517,126521,126522,126526,126527,126531,126532,126536,126537,126539,126546,126550,126551,126555,126556,126560,126561,126565,126566,126568,126569,126573,126574,126578,126579,126581,126582,126586,126587,126591,126592,126596,126597,126601,126602,126606,126607,126611,126612,126614,126618,126622,126623,126627,126628,126632,126633,126635,126636,126640,126641,126643,126644,126648,126649,126651,126652,126656,126657,126661,126662,126666,126667,126710,126713,126808,127676,127677,131072,131083,131229,131230,132084,132085,136778,136779,137966,137969,140861,140863,140873,140916,147449,147451,152343,152345,152346,152347,154320,154321,154327,154329,156340,156342,158469,158472,160534,160536,160538,160541,162028,162029,163840,163842,163911,163924,170318,170320,172907,172908,173115,173117,173543,173545,175462,175464,175634,175635,178467,178468,181979,181981,182026,182028,182326,182328,183588,183590,184667,184669,185129,185130,187402,187403,191035,191036,193668,193669,196608,196648,198572,198574,198592,229378,229447,262151,262155,282479,283337,287829,287899,287900") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "8,1,11,12,15,207,213,229,230") == "4cbdf30fa25339532be04a0315e9e80a5e8c73e6" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
check_first_block(map_partition("odm"));
ifelse (block_image_recover(map_partition("odm"), "8,1,11,12,15,207,213,229,230") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm 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:e6e9fa03acc82494c7feb393b63b002866d8299c",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:d15469ac83a361d00fb06034780b0b46998f7153",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:d15469ac83a361d00fb06034780b0b46998f7153");

# ---- 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/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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/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/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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Patch partition product

ui_print("Patching product image after verification.");
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition vendor

ui_print("Patching vendor image after verification.");
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Patch partition system

ui_print("Patching system image after verification.");
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
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");
