| 1 |
- {"remainingRequest":"E:\\item\\newItem\\admin\\node_modules\\babel-loader\\lib\\index.js!E:\\item\\newItem\\admin\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!E:\\item\\newItem\\admin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!E:\\item\\newItem\\admin\\node_modules\\iview-loader\\index.js??ref--0-2!E:\\item\\newItem\\admin\\src\\pages\\product\\productAdd\\index.vue?vue&type=script&lang=js&","dependencies":[{"path":"E:\\item\\newItem\\admin\\src\\pages\\product\\productAdd\\index.vue","mtime":1677828270227},{"path":"E:\\item\\newItem\\admin\\babel.config.js","mtime":1677828270071},{"path":"E:\\item\\newItem\\admin\\.babelrc","mtime":1677828270070},{"path":"E:\\item\\newItem\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\newItem\\admin\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"E:\\item\\newItem\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\newItem\\admin\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000},{"path":"E:\\item\\newItem\\admin\\node_modules\\iview-loader\\index.js","mtime":1570440814000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJFOi9pdGVtL25ld0l0ZW0vYWRtaW4vbm9kZV9tb2R1bGVzL0B2dWUvYmFiZWwtcHJlc2V0LWFwcC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSAiRTovaXRlbS9uZXdJdGVtL2FkbWluL25vZGVfbW9kdWxlcy9AdnVlL2JhYmVsLXByZXNldC1hcHAvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiOwppbXBvcnQgX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIgZnJvbSAiRTovaXRlbS9uZXdJdGVtL2FkbWluL25vZGVfbW9kdWxlcy9AdnVlL2JhYmVsLXByZXNldC1hcHAvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIuanMiOwppbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICJFOi9pdGVtL25ld0l0ZW0vYWRtaW4vbm9kZV9tb2R1bGVzL0B2dWUvYmFiZWwtcHJlc2V0LWFwcC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyI7CmltcG9ydCAicmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwppbXBvcnQgdXNlckxhYmVsIGZyb20gJ0AvY29tcG9uZW50cy9sYWJlbExpc3QnOwppbXBvcnQgeyBtYXBTdGF0ZSB9IGZyb20gJ3Z1ZXgnOwppbXBvcnQgdnVlZHJhZ2dhYmxlIGZyb20gJ3Z1ZWRyYWdnYWJsZSc7CmltcG9ydCB1cGxvYWRQaWN0dXJlcyBmcm9tICdAL2NvbXBvbmVudHMvdXBsb2FkUGljdHVyZXMnOwppbXBvcnQgZnJlaWdodFRlbXBsYXRlIGZyb20gJ0AvY29tcG9uZW50cy9mcmVpZ2h0VGVtcGxhdGUnOwppbXBvcnQgY291cG9uTGlzdCBmcm9tICdAL2NvbXBvbmVudHMvY291cG9uTGlzdCc7CmltcG9ydCBhZGRBdHRyIGZyb20gJy4uL3Byb2R1Y3RBdHRyL2FkZEF0dHInOwppbXBvcnQgZ29vZHNMaXN0IGZyb20gJ0AvY29tcG9uZW50cy9nb29kc0xpc3QvaW5kZXgnOwppbXBvcnQgdGFvQmFvIGZyb20gJy4vdGFvQmFvJzsKaW1wb3J0IFdhbmdFZGl0b3IgZnJvbSAnQC9jb21wb25lbnRzL3dhbmdFZGl0b3IvaW5kZXgudnVlJzsKaW1wb3J0IHsgdXNlckxhYmVsQWRkQXBpIH0gZnJvbSAnQC9hcGkvdXNlcic7CmltcG9ydCB7IHByb2R1Y3RJbmZvQXBpLCB0cmVlTGlzdEFwaSwgcHJvZHVjdEFkZEFwaSwgZ2VuZXJhdGVBdHRyQXBpLCBwcm9kdWN0R2V0UnVsZUFwaSwgcHJvZHVjdEdldFRlbXBsYXRlQXBpLCBwcm9kdWN0R2V0VGVtcEtleXNBcGksIGNoZWNrQWN0aXZpdHlBcGksIHByb2R1Y3RDYWNoZSwgY2FjaGVEZWxldGUsIHVwbG9hZFR5cGUgYXMgX3VwbG9hZFR5cGUsIGltcG9ydENhcmQsIHByb2R1Y3RDcmVhdGVBcGkgfSBmcm9tICdAL2FwaS9wcm9kdWN0JzsKaW1wb3J0IFNldHRpbmcgZnJvbSAnQC9zZXR0aW5nJzsKaW1wb3J0IHsgZ2V0Q29va2llcyB9IGZyb20gJ0AvbGlicy91dGlsJzsKaW1wb3J0IHsgdXBsb2FkQnlQaWVjZXMgfSBmcm9tICdAL3V0aWxzL3VwbG9hZCc7IC8v5byV5YWldXBsb2FkQnlQaWVjZXPmlrnms5UKCmV4cG9ydCBkZWZhdWx0IHsKICBuYW1lOiAncHJvZHVjdF9wcm9kdWN0QWRkJywKICBjb21wb25lbnRzOiB7CiAgICAvLyBWdWVVZWRpdG9yV3JhcCwKICAgIHVwbG9hZFBpY3R1cmVzOiB1cGxvYWRQaWN0dXJlcywKICAgIGZyZWlnaHRUZW1wbGF0ZTogZnJlaWdodFRlbXBsYXRlLAogICAgYWRkQXR0cjogYWRkQXR0ciwKICAgIGNvdXBvbkxpc3Q6IGNvdXBvbkxpc3QsCiAgICB0YW9CYW86IHRhb0JhbywKICAgIGRyYWdnYWJsZTogdnVlZHJhZ2dhYmxlLAogICAgZ29vZHNMaXN0OiBnb29kc0xpc3QsCiAgICBXYW5nRWRpdG9yOiBXYW5nRWRpdG9yLAogICAgdXNlckxhYmVsOiB1c2VyTGFiZWwKICB9LAogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBsYWJlbFNob3c6IGZhbHNlLAogICAgICBkYXRhTGFiZWw6IFtdLAogICAgICBoZWFkVGFiOiBbewogICAgICAgIHRpdDogJ+WfuuehgOS/oeaBrycsCiAgICAgICAgbmFtZTogJzEnCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfop4TmoLzlupPlrZgnLAogICAgICAgIG5hbWU6ICcyJwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn5ZWG5ZOB6K+m5oOFJywKICAgICAgICBuYW1lOiAnMycKICAgICAgfSwgewogICAgICAgIHRpdDogJ+eJqea1geiuvue9ricsCiAgICAgICAgbmFtZTogJzQnCiAgICAgIH0sIHsKICAgICAgICB0aXQ6ICfokKXplIDorr7nva4nLAogICAgICAgIG5hbWU6ICc1JwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn5YW25LuW6K6+572uJywKICAgICAgICBuYW1lOiAnNicKICAgICAgfV0sCiAgICAgIHZpcnR1YWw6IFt7CiAgICAgICAgdGl0OiAn5pmu6YCa5ZWG5ZOBJywKICAgICAgICBpZDogMCwKICAgICAgICB0aXQyOiAn54mp5rWB5Y+R6LSnJwogICAgICB9LCB7CiAgICAgICAgdGl0OiAn5Y2h5a+GL+e9keebmCcsCiAgICAgICAgaWQ6IDEsCiAgICAgICAgdGl0MjogJ+iHquWKqOWPkei0pycKICAgICAgfSwgewogICAgICAgIHRpdDogJ+S8mOaDoOWIuCcsCiAgICAgICAgaWQ6IDIsCiAgICAgICAgdGl0MjogJ+iHquWKqOWPkei0pycKICAgICAgfSwgewogICAgICAgIHRpdDogJ+iZmuaLn+WVhuWTgScsCiAgICAgICAgaWQ6IDMsCiAgICAgICAgdGl0MjogJ+iZmuaLn+WPkei0pycKICAgICAgfV0sCiAgICAgIHNlbGV0VmlkZW86IDAsCiAgICAgIC8v6YCJ5oup6KeG6aKR57G75Z6LCiAgICAgIGN1c3RvbUJ0bjogZmFsc2UsCiAgICAgIC8v6Ieq5a6a5LmJ55WZ6KiA5byA5YWzCiAgICAgIGNvbnRlbnQ6ICcnLAogICAgICBjb250ZW50czogJycsCiAgICAgIGZpbGVVcmw6IFNldHRpbmcuYXBpQmFzZVVSTCArICcvZmlsZS91cGxvYWQnLAogICAgICBmaWxlVXJsMjogU2V0dGluZy5hcGlCYXNlVVJMICsgJy9maWxlL3ZpZGVvX3VwbG9hZCcsCiAgICAgIGNhcmRVcmw6IFNldHRpbmcuYXBpQmFzZVVSTCArICcvZmlsZS91cGxvYWQvMScsCiAgICAgIHVwbG9hZF90eXBlOiAnJywKICAgICAgLy/op4bpopHkuIrkvKDnsbvlnosgMSDmnKzlnLDkuIrkvKAgMiAzIDQgT1NT5LiK5LygCiAgICAgIHVwbG9hZERhdGE6IHt9LAogICAgICAvLyDkuIrkvKDlj4LmlbAKICAgICAgaGVhZGVyOiB7fSwKICAgICAgdHlwZTogMCwKICAgICAgbW9kYWxzOiBmYWxzZSwKICAgICAgZ29vZHNfbW9kYWxzOiBmYWxzZSwKICAgICAgc3BpblNob3c6IGZhbHNlLAogICAgICBvcGVuU3ViaW1pdDogZmFsc2UsCiAgICAgIHZpcnR1YWxEYXRhOiAnJywKICAgICAgdmlydHVhbExpc3Q6IFt7CiAgICAgICAga2V5OiAnJywKICAgICAgICB2YWx1ZTogJycKICAgICAgfV0sCiAgICAgIGdyaWQyOiB7CiAgICAgICAgeGw6IDEwLAogICAgICAgIGxnOiAxMiwKICAgICAgICBtZDogMTIsCiAgICAgICAgc206IDI0LAogICAgICAgIHhzOiAyNAogICAgICB9LAogICAgICBncmlkMzogewogICAgICAgIHhsOiAxOCwKICAgICAgICBsZzogMTgsCiAgICAgICAgbWQ6IDIwLAogICAgICAgIHNtOiAyNCwKICAgICAgICB4czogMjQKICAgICAgfSwKICAgICAgLy8g5om56YeP6K6+572u6KGo5qC8ZGF0YQogICAgICBvbmVGb3JtQmF0Y2g6IFt7CiAgICAgICAgcGljOiAnJywKICAgICAgICBwcmljZTogMCwKICAgICAgICBjb3N0OiAwLAogICAgICAgIG90X3ByaWNlOiAwLAogICAgICAgIHN0b2NrOiAwLAogICAgICAgIGJhcl9jb2RlOiAnJywKICAgICAgICB3ZWlnaHQ6IDAsCiAgICAgICAgdm9sdW1lOiAwCiAgICAgIH1dLAogICAgICAvLyDop4TmoLzmlbDmja4KICAgICAgZm9ybUR5bmFtaWM6IHsKICAgICAgICBhdHRyc05hbWU6ICcnLAogICAgICAgIGF0dHJzVmFsOiAnJwogICAgICB9LAogICAgICBkaXNrX3R5cGU6IDEsCiAgICAgIC8v5Y2h5a+G57G75Z6LCiAgICAgIHRhYkluZGV4OiAwLAogICAgICB0YWJOYW1lOiAnJywKICAgICAgZm9ybUR5bmFtaWNOYW1lRGF0YTogW10sCiAgICAgIGlzQnRuOiBmYWxzZSwKICAgICAgY29sdW1uczI6IFt7CiAgICAgICAgdGl0bGU6ICflm77niYcnLAogICAgICAgIHNsb3Q6ICdwaWMnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICBtaW5XaWR0aDogODAKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5ZSu5Lu3JywKICAgICAgICBzbG90OiAncHJpY2UnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICBtaW5XaWR0aDogOTUKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5oiQ5pys5Lu3JywKICAgICAgICBzbG90OiAnY29zdCcsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfljp/ku7cnLAogICAgICAgIHNsb3Q6ICdvdF9wcmljZScsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICflupPlrZgnLAogICAgICAgIHNsb3Q6ICdzdG9jaycsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfllYblk4HnvJblj7cnLAogICAgICAgIHNsb3Q6ICdiYXJfY29kZScsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiAxMjAKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn6YeN6YeP77yIS0fvvIknLAogICAgICAgIHNsb3Q6ICd3ZWlnaHQnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICBtaW5XaWR0aDogOTUKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5L2T56evKG3CsyknLAogICAgICAgIHNsb3Q6ICd2b2x1bWUnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICBtaW5XaWR0aDogOTUKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5pON5L2cJywKICAgICAgICBzbG90OiAnYWN0aW9uJywKICAgICAgICBmaXhlZDogJ3JpZ2h0JywKICAgICAgICBhbGlnbjogJ2NlbnRlcicsCiAgICAgICAgbWluV2lkdGg6IDE0MAogICAgICB9XSwKICAgICAgY29sdW1uczM6IFt7CiAgICAgICAgdGl0bGU6ICflm77niYcnLAogICAgICAgIHNsb3Q6ICdwaWMnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICBtaW5XaWR0aDogODAKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5ZSu5Lu3JywKICAgICAgICBzbG90OiAncHJpY2UnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICBtaW5XaWR0aDogOTUKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5oiQ5pys5Lu3JywKICAgICAgICBzbG90OiAnY29zdCcsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfljp/ku7cnLAogICAgICAgIHNsb3Q6ICdvdF9wcmljZScsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICflupPlrZgnLAogICAgICAgIHNsb3Q6ICdzdG9jaycsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfllYblk4HnvJblj7cnLAogICAgICAgIHNsb3Q6ICdiYXJfY29kZScsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiAxMjAKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn6Jma5ouf5ZWG5ZOBJywKICAgICAgICBzbG90OiAnZmljdGl0aW91cycsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIG1pbldpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfmk43kvZwnLAogICAgICAgIHNsb3Q6ICdhY3Rpb24nLAogICAgICAgIGZpeGVkOiAncmlnaHQnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICBtaW5XaWR0aDogMTQwCiAgICAgIH1dLAogICAgICBjb2x1bW5zOiBbXSwKICAgICAgY29sdW1uc0luc3RhbGw6IFtdLAogICAgICBjb2x1bW5zSW5zdGFsMjogW10sCiAgICAgIGdyaWRQaWM6IHsKICAgICAgICB4bDogNiwKICAgICAgICBsZzogOCwKICAgICAgICBtZDogMTIsCiAgICAgICAgc206IDEyLAogICAgICAgIHhzOiAxMgogICAgICB9LAogICAgICBncmlkQnRuOiB7CiAgICAgICAgeGw6IDQsCiAgICAgICAgbGc6IDgsCiAgICAgICAgbWQ6IDgsCiAgICAgICAgc206IDgsCiAgICAgICAgeHM6IDgKICAgICAgfSwKICAgICAgLy/oh6rlrprkuYnnlZnoqIDkuIvmi4npgInmi6kKICAgICAgQ3VzdG9tTGlzdDogW3sKICAgICAgICB2YWx1ZTogJ3RleHQnLAogICAgICAgIGxhYmVsOiAn5paH5pys5qGGJwogICAgICB9LCB7CiAgICAgICAgdmFsdWU6ICdudW1iZXInLAogICAgICAgIGxhYmVsOiAn5pWw5a2XJwogICAgICB9LCB7CiAgICAgICAgdmFsdWU6ICdlbWFpbCcsCiAgICAgICAgbGFiZWw6ICfpgq7ku7YnCiAgICAgIH0sIHsKICAgICAgICB2YWx1ZTogJ2RhdGEnLAogICAgICAgIGxhYmVsOiAn5pel5pyfJwogICAgICB9LCB7CiAgICAgICAgdmFsdWU6ICd0aW1lJywKICAgICAgICBsYWJlbDogJ+aXtumXtCcKICAgICAgfSwgewogICAgICAgIHZhbHVlOiAnaWQnLAogICAgICAgIGxhYmVsOiAn6Lqr5Lu96K+BJwogICAgICB9LCB7CiAgICAgICAgdmFsdWU6ICdwaG9uZScsCiAgICAgICAgbGFiZWw6ICfmiYvmnLrlj7cnCiAgICAgIH0sIHsKICAgICAgICB2YWx1ZTogJ2ltZycsCiAgICAgICAgbGFiZWw6ICflm77niYcnCiAgICAgIH1dLAogICAgICBjdXN0b21lc3M6IHsKICAgICAgICBjb250ZW50OiBbXQogICAgICB9LAogICAgICAvL+iHquWumuS5ieeVmeiogOWGheWuuQogICAgICBmb3JtVmFsaWRhdGU6IHsKICAgICAgICBkaXNrX2luZm86ICcnLAogICAgICAgIC8v5Y2h5a+G57G75Z6LCiAgICAgICAgbG9naXN0aWNzOiBbJzEnXSwKICAgICAgICAvL+mAieaLqeeJqea1geaWueW8jwogICAgICAgIGZyZWlnaHQ6IDIsCiAgICAgICAgLy/ov5DotLnorr7nva4KICAgICAgICBwb3N0YWdlOiAwLAogICAgICAgIC8v6K6+572u6L+Q6LS56YeR6aKdCiAgICAgICAgcmVjb21tZW5kOiBbXSwKICAgICAgICAvL+WVhuWTgeaOqOiNkAogICAgICAgIHByZXNhbGVfZGF5OiAxLAogICAgICAgIC8v6aKE5ZSu5Y+R6LSn5pe26Ze0Lee7k+adnwogICAgICAgIHByZXNhbGU6IGZhbHNlLAogICAgICAgIC8v6aKE5ZSu5ZWG5ZOB5byA5YWzCiAgICAgICAgaXNfbGltaXQ6IGZhbHNlLAogICAgICAgIGxpbWl0X3R5cGU6IDAsCiAgICAgICAgbGltaXRfbnVtOiAwLAogICAgICAgIHZpZGVvX29wZW46IGZhbHNlLAogICAgICAgIC8v6KeG6aKR5oyJ6ZKu5piv5ZCm5pi+56S6CiAgICAgICAgdmlwX3Byb2R1Y3Q6IGZhbHNlLAogICAgICAgIC8v5LuY6LS55Lya5ZGY5LiT5bGe5byA5YWzCiAgICAgICAgY3VzdG9tX2Zvcm06IFtdLAogICAgICAgIC8v6Ieq5a6a5LmJ55WZ6KiACiAgICAgICAgc3RvcmVfbmFtZTogJycsCiAgICAgICAgY2F0ZV9pZDogW10sCiAgICAgICAgbGFiZWxfaWQ6IFtdLAogICAgICAgIGtleXdvcmQ6ICcnLAogICAgICAgIHVuaXRfbmFtZTogJycsCiAgICAgICAgc3RvcmVfaW5mbzogJycsCiAgICAgICAgaW1hZ2U6ICcnLAogICAgICAgIHJlY29tbWVuZF9pbWFnZTogJycsCiAgICAgICAgc2xpZGVyX2ltYWdlOiBbXSwKICAgICAgICBkZXNjcmlwdGlvbjogJycsCiAgICAgICAgZmljdGk6IDAsCiAgICAgICAgZ2l2ZV9pbnRlZ3JhbDogMCwKICAgICAgICBzb3J0OiAwLAogICAgICAgIGlzX3Nob3c6IDEsCiAgICAgICAgaXNfaG90OiAwLAogICAgICAgIGlzX2JlbmVmaXQ6IDAsCiAgICAgICAgaXNfYmVzdDogMCwKICAgICAgICBpc19uZXc6IDAsCiAgICAgICAgaXNfZ29vZDogMCwKICAgICAgICBpc19wb3N0YWdlOiAwLAogICAgICAgIGlzX3N1YjogW10sCiAgICAgICAgcmVjb21tZW5kX2xpc3Q6IFtdLAogICAgICAgIHZpcnR1YWxfdHlwZTogMCwKICAgICAgICAvLyBpc19zdWI6IDAsCiAgICAgICAgaWQ6IDAsCiAgICAgICAgc3BlY190eXBlOiAwLAogICAgICAgIGlzX3ZpcnR1YWw6IDAsCiAgICAgICAgdmlkZW9fbGluazogJycsCiAgICAgICAgLy8gcG9zdGFnZTogMCwKICAgICAgICB0ZW1wX2lkOiAnJywKICAgICAgICBhdHRyczogW10sCiAgICAgICAgaXRlbXM6IFt7CiAgICAgICAgICBwaWM6ICcnLAogICAgICAgICAgcHJpY2U6IDAsCiAgICAgICAgICBjb3N0OiAwLAogICAgICAgICAgb3RfcHJpY2U6IDAsCiAgICAgICAgICBzdG9jazogMCwKICAgICAgICAgIGJhcl9jb2RlOiAnJwogICAgICAgIH1dLAogICAgICAgIGFjdGl2aXR5OiBbJ+m7mOiupCcsICfnp5LmnYAnLCAn56CN5Lu3JywgJ+aLvOWboiddLAogICAgICAgIGNvdXBvbk5hbWU6IFtdLAogICAgICAgIGhlYWRlcjogW10sCiAgICAgICAgc2VsZWN0UnVsZTogJycsCiAgICAgICAgY291cG9uX2lkczogW10sCiAgICAgICAgY29tbWFuZF93b3JkOiAnJwogICAgICB9LAogICAgICBydWxlTGlzdDogW10sCiAgICAgIHRlbXBsYXRlTGlzdDogW10sCiAgICAgIGNyZWF0ZUJudDogdHJ1ZSwKICAgICAgc2hvd0lwdXQ6IGZhbHNlLAogICAgICBtYW55Rm9ybVZhbGlkYXRlOiBbXSwKICAgICAgLy8g5Y2V6KeE5qC86KGo5qC8ZGF0YQogICAgICBvbmVGb3JtVmFsaWRhdGU6IFt7CiAgICAgICAgcGljOiAnJywKICAgICAgICBwcmljZTogMCwKICAgICAgICBjb3N0OiAwLAogICAgICAgIG90X3ByaWNlOiAwLAogICAgICAgIHN0b2NrOiAwLAogICAgICAgIGJhcl9jb2RlOiAnJywKICAgICAgICB3ZWlnaHQ6IDAsCiAgICAgICAgdm9sdW1lOiAwLAogICAgICAgIGJyb2tlcmFnZTogMCwKICAgICAgICBicm9rZXJhZ2VfdHdvOiAwLAogICAgICAgIHZpcF9wcmljZTogMCwKICAgICAgICB2aXJ0dWFsX2xpc3Q6IFtdLAogICAgICAgIGNvdXBvbl9pZDogMAogICAgICB9XSwKICAgICAgaW1hZ2VzOiBbXSwKICAgICAgaW1hZ2VzVGFibGU6ICcnLAogICAgICBjdXJyZW50VGFiOiAnMScsCiAgICAgIGlzQ2hvaWNlOiAnJywKICAgICAgZ3JpZDogewogICAgICAgIHhsOiA4LAogICAgICAgIGxnOiA4LAogICAgICAgIG1kOiAxMiwKICAgICAgICBzbTogMjQsCiAgICAgICAgeHM6IDI0CiAgICAgIH0sCiAgICAgIGxvYWRpbmc6IGZhbHNlLAogICAgICBtb2RhbFBpYzogZmFsc2UsCiAgICAgIGFkZFZpcnR1YWxNb2RlbDogZmFsc2UsCiAgICAgIHRlbXBsYXRlOiBmYWxzZSwKICAgICAgdXBsb2FkTGlzdDogW10sCiAgICAgIHRyZWVTZWxlY3Q6IFtdLAogICAgICBwaWNUaXQ6ICcnLAogICAgICB0YWJsZUluZGV4OiAwLAogICAgICBydWxlVmFsaWRhdGU6IHsKICAgICAgICBzdG9yZV9uYW1lOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn6K+36L6T5YWl5ZWG5ZOB5ZCN56ewJywKICAgICAgICAgIHRyaWdnZXI6ICdibHVyJwogICAgICAgIH1dLAogICAgICAgIGNhdGVfaWQ6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1lc3NhZ2U6ICfor7fpgInmi6nllYblk4HliIbnsbsnLAogICAgICAgICAgdHJpZ2dlcjogJ2NoYW5nZScsCiAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgbWluOiAnMScKICAgICAgICB9XSwKICAgICAgICB1bml0X25hbWU6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1lc3NhZ2U6ICfor7fovpPlhaXljZXkvY0nLAogICAgICAgICAgdHJpZ2dlcjogJ2JsdXInCiAgICAgICAgfV0sCiAgICAgICAgLy8gaW1hZ2U6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAi6K+35LiK5Lyg5ZWG5ZOB5Zu+IiwgdHJpZ2dlcjogImNoYW5nZSIgfV0sCiAgICAgICAgc2xpZGVyX2ltYWdlOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn6K+35LiK5Lyg5ZWG5ZOB6L2u5pKt5Zu+JywKICAgICAgICAgIHR5cGU6ICdhcnJheScsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dLAogICAgICAgIHNwZWNfdHlwZTogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqeWVhuWTgeinhOagvCcsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dLAogICAgICAgIGlzX3ZpcnR1YWw6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1lc3NhZ2U6ICfor7fpgInmi6nllYblk4HnsbvlnosnLAogICAgICAgICAgdHJpZ2dlcjogJ2NoYW5nZScKICAgICAgICB9XSwKICAgICAgICBzZWxlY3RSdWxlOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn6K+36YCJ5oup5ZWG5ZOB6KeE5qC85bGe5oCnJywKICAgICAgICAgIHRyaWdnZXI6ICdjaGFuZ2UnCiAgICAgICAgfV0sCiAgICAgICAgdGVtcF9pZDogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqei/kOi0ueaooeadvycsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJywKICAgICAgICAgIHR5cGU6ICdudW1iZXInCiAgICAgICAgfV0sCiAgICAgICAgcHJlc2FsZV90aW1lOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqea0u+WKqOaXtumXtCcsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dLAogICAgICAgIGxvZ2lzdGljczogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgIG1pbjogMSwKICAgICAgICAgIG1lc3NhZ2U6ICfor7fpgInmi6nnianmtYHmlrnlvI8nLAogICAgICAgICAgdHJpZ2dlcjogJ2NoYW5nZScKICAgICAgICB9LCB7CiAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgbWF4OiAyLAogICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqeeJqea1geaWueW8jycsCiAgICAgICAgICB0cmlnZ2VyOiAnY2hhbmdlJwogICAgICAgIH1dLAogICAgICAgIGdpdmVfaW50ZWdyYWw6IFt7CiAgICAgICAgICB0eXBlOiAnaW50ZWdlcicsCiAgICAgICAgICBtZXNzYWdlOiAn6K+36L6T5YWl5pW05pWwJwogICAgICAgIH1dCiAgICAgIH0sCiAgICAgIG1hbnlCcm9rZXJhZ2U6IDAsCiAgICAgIG1hbnlCcm9rZXJhZ2VUd286IDAsCiAgICAgIG1hbnlWaXBQcmljZTogMCwKICAgICAgdXBsb2FkOiB7CiAgICAgICAgdmlkZW9Jbmc6IGZhbHNlIC8vIOaYr+WQpuaYvuekuui/m+W6puadoe+8mwoKICAgICAgfSwKICAgICAgdmlkZW9Jbmc6IGZhbHNlLAogICAgICAvLyDmmK/lkKbmmL7npLrov5vluqbmnaHvvJsKICAgICAgcHJvZ3Jlc3M6IDAsCiAgICAgIC8vIOi/m+W6puadoem7mOiupDAKICAgICAgc3RvY2s6IDAsCiAgICAgIGRpc2tfaW5mbzogJycsCiAgICAgIHZpZGVvTGluazogJycsCiAgICAgIGF0dHJzOiBbXSwKICAgICAgYWN0aXZpdHk6IHsKICAgICAgICDpu5jorqQ6ICdyZWQnLAogICAgICAgIOenkuadgDogJ2JsdWUnLAogICAgICAgIOegjeS7tzogJ2dyZWVuJywKICAgICAgICDmi7zlm6I6ICd5ZWxsb3cnCiAgICAgIH0sCiAgICAgIGNvdXBvbk5hbWU6IFtdLAogICAgICB1cGRhdGVJZHM6IFtdLAogICAgICB1cGRhdGVOYW1lOiBbXSwKICAgICAgY291cG9uSWRzOiAnJywKICAgICAgY291cG9uTmFtZXM6IFtdLAogICAgICByYWtlQmFjazogW3sKICAgICAgICB0aXRsZTogJ+S4gOe6p+i/lOS9oycsCiAgICAgICAgc2xvdDogJ2Jyb2tlcmFnZScsCiAgICAgICAgYWxpZ246ICdjZW50ZXInLAogICAgICAgIHdpZHRoOiA5NQogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfkuoznuqfov5TkvaMnLAogICAgICAgIHNsb3Q6ICdicm9rZXJhZ2VfdHdvJywKICAgICAgICBhbGlnbjogJ2NlbnRlcicsCiAgICAgICAgd2lkdGg6IDk1CiAgICAgIH1dLAogICAgICBtZW1iZXI6IFt7CiAgICAgICAgdGl0bGU6ICfkvJrlkZjku7cnLAogICAgICAgIHNsb3Q6ICd2aXBfcHJpY2UnLAogICAgICAgIGFsaWduOiAnY2VudGVyJywKICAgICAgICB3aWR0aDogOTUKICAgICAgfV0sCiAgICAgIGNvbHVtbnNJbnN0YWxNOiBbXSwKICAgICAgbW92ZUluZGV4OiAnJyAvLyBhYTogW10sCiAgICAgIC8vIG9wZW5TdWJpbWl0OiBmYWxzZQoKICAgIH07CiAgfSwKICBjb21wdXRlZDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBtYXBTdGF0ZSgnbWVkaWEnLCBbJ2lzTW9iaWxlJ10pKSwge30sIHsKICAgIGxhYmVsV2lkdGg6IGZ1bmN0aW9uIGxhYmVsV2lkdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlID8gdW5kZWZpbmVkIDogMTIwOwogICAgfSwKICAgIGxhYmVsUG9zaXRpb246IGZ1bmN0aW9uIGxhYmVsUG9zaXRpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlID8gJ3RvcCcgOiAncmlnaHQnOwogICAgfSwKICAgIGxhYmVsQm90dG9tOiBmdW5jdGlvbiBsYWJlbEJvdHRvbSgpIHsKICAgICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB1bmRlZmluZWQgOiAxNTsKICAgIH0KICB9KSwKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkgewogICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCA4KTsKICAgIHRoaXMuZ2V0VG9rZW4oKTsgLy8gdGhpcy5jb2x1bW5zSW5zdGFsbCA9IHRoaXMuY29sdW1uczIuc2xpY2UoMCwgNCkuY29uY2F0KHRoaXMuY29sdW1uc0luc3RhbGwpOwogICAgLy8gdGhpcy5jb2x1bW5zSW5zdGE4ID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCA0KS5jb25jYXQodGhpcy5jb2x1bW5zSW5zdGE4KTsKICB9LAogIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7CiAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgIGlmICh0aGlzLiRyb3V0ZS5wYXJhbXMuaWQgIT09ICcwJyAmJiB0aGlzLiRyb3V0ZS5wYXJhbXMuaWQpIHsKICAgICAgdGhpcy5nZXRJbmZvKCk7CiAgICB9IGVsc2UgaWYgKHRoaXMuJHJvdXRlLnBhcmFtcy5pZCA9PT0gJzAnKSB7CiAgICAgIHByb2R1Y3RDYWNoZSgpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgIHZhciBkYXRhID0gcmVzLmRhdGEuaW5mbzsKCiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICB2YXIgY2F0ZV9pZCA9IGRhdGEuY2F0ZV9pZC5tYXAoTnVtYmVyKTsKICAgICAgICAgIHZhciBsYWJlbF9pZCA9IGRhdGEubGFiZWxfaWQubWFwKE51bWJlcik7CiAgICAgICAgICBfdGhpcy5hdHRycyA9IGRhdGEuaXRlbXMgfHwgW107CiAgICAgICAgICB2YXIgaWRzID0gW107IC8vIGxldCBuYW1lcyA9IFtdOwoKICAgICAgICAgIGlmIChkYXRhLmNvdXBvbnMpIHsKICAgICAgICAgICAgZGF0YS5jb3Vwb25zLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgIGlkcy5wdXNoKGl0ZW0uaWQpOyAvLyBuYW1lcy5wdXNoKGl0ZW0udGl0bGUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgX3RoaXMuY291cG9uTmFtZSA9IGRhdGEuY291cG9uczsKICAgICAgICAgIH0KCiAgICAgICAgICBfdGhpcy5mb3JtVmFsaWRhdGUgPSBkYXRhOyAvLyB0aGlzLmNvdXBvbk5hbWUgPSBkYXRhLmNvdXBvbnM7CiAgICAgICAgICAvLyB0aGF0LmNvdXBvbk5hbWUgPSBuYW1lczsKCiAgICAgICAgICBfdGhpcy5kYXRhTGFiZWwgPSBkYXRhLmxhYmVsX2lkOwogICAgICAgICAgX3RoaXMuZm9ybVZhbGlkYXRlLmNvdXBvbl9pZHMgPSBpZHM7CiAgICAgICAgICBfdGhpcy51cGRhdGVJZHMgPSBpZHM7CiAgICAgICAgICBfdGhpcy51cGRhdGVOYW1lID0gZGF0YS5jb3Vwb25zOwogICAgICAgICAgX3RoaXMuZm9ybVZhbGlkYXRlLmNhdGVfaWQgPSBjYXRlX2lkOyAvLyB0aGlzLmZvcm1WYWxpZGF0ZS5sYWJlbF9pZCA9IGxhYmVsX2lkOwoKICAgICAgICAgIF90aGlzLm9uZUZvcm1WYWxpZGF0ZSA9IGRhdGEuYXR0cnM7CiAgICAgICAgICBfdGhpcy5mb3JtVmFsaWRhdGUubG9naXN0aWNzID0gZGF0YS5sb2dpc3RpY3MgfHwgWycxJ107CiAgICAgICAgICBfdGhpcy5mb3JtVmFsaWRhdGUuaGVhZGVyID0gW107CgogICAgICAgICAgX3RoaXMuZ2VuZXJhdGUoMCk7CgogICAgICAgICAgX3RoaXMubWFueUZvcm1WYWxpZGF0ZSA9IGRhdGEuYXR0cnM7CiAgICAgICAgICBfdGhpcy5zcGVjX3R5cGUgPSBkYXRhLnNwZWNfdHlwZTsKICAgICAgICAgIF90aGlzLmZvcm1WYWxpZGF0ZS5pc192aXJ0dWFsID0gZGF0YS5pc192aXJ0dWFsOwogICAgICAgICAgX3RoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtID0gZGF0YS5jdXN0b21fZm9ybSB8fCBbXTsKCiAgICAgICAgICBpZiAoX3RoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtLmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgIF90aGlzLmN1c3RvbUJ0biA9IHRydWU7CiAgICAgICAgICB9CgogICAgICAgICAgX3RoaXMudmlydHVhbGJ0bihkYXRhLnZpcnR1YWxfdHlwZSwgMSk7CgogICAgICAgICAgaWYgKGRhdGEuc3BlY190eXBlID09PSAwKSB7CiAgICAgICAgICAgIF90aGlzLm1hbnlGb3JtVmFsaWRhdGUgPSBbXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF90aGlzLmNyZWF0ZUJudCA9IHRydWU7CiAgICAgICAgICAgIF90aGlzLm9uZUZvcm1WYWxpZGF0ZSA9IFt7CiAgICAgICAgICAgICAgcGljOiBkYXRhLmltYWdlLAogICAgICAgICAgICAgIHByaWNlOiAwLAogICAgICAgICAgICAgIGNvc3Q6IDAsCiAgICAgICAgICAgICAgb3RfcHJpY2U6IDAsCiAgICAgICAgICAgICAgc3RvY2s6IDAsCiAgICAgICAgICAgICAgYmFyX2NvZGU6ICcnLAogICAgICAgICAgICAgIHdlaWdodDogMCwKICAgICAgICAgICAgICB2b2x1bWU6IDAsCiAgICAgICAgICAgICAgYnJva2VyYWdlOiAwLAogICAgICAgICAgICAgIGJyb2tlcmFnZV90d286IDAsCiAgICAgICAgICAgICAgdmlwX3ByaWNlOiAwLAogICAgICAgICAgICAgIHZpcnR1YWxfbGlzdDogW10sCiAgICAgICAgICAgICAgY291cG9uX2lkOiAwCiAgICAgICAgICAgIH1dOwogICAgICAgICAgfQoKICAgICAgICAgIF90aGlzLnNwaW5TaG93ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgX3RoaXMuJE1lc3NhZ2UuZXJyb3IoZXJyLm1zZyk7CiAgICAgIH0pOwogICAgfQoKICAgIGlmICh0aGlzLiRyb3V0ZS5xdWVyeS50eXBlKSB7CiAgICAgIHRoaXMubW9kYWxzID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gdGhpcy4kcm91dGUucXVlcnkudHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMudHlwZSA9IDA7CiAgICB9CgogICAgdGhpcy5nb29kc0NhdGVnb3J5KCk7CiAgICB0aGlzLnByb2R1Y3RHZXRSdWxlKCk7CiAgICB0aGlzLnByb2R1Y3RHZXRUZW1wbGF0ZSgpOyAvLyB0aGlzLnVzZXJMYWJlbCgpOwoKICAgIHRoaXMudXBsb2FkVHlwZSgpOwogIH0sCiAgbWV0aG9kczogewogICAgLy8g5YiG54mH5LiK5LygCiAgICB2aWRlb1NhdmVUb1VybDogZnVuY3Rpb24gdmlkZW9TYXZlVG9VcmwoZmlsZSkgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKCiAgICAgIHVwbG9hZEJ5UGllY2VzKHsKICAgICAgICBmaWxlOiBmaWxlLAogICAgICAgIC8vIOinhumikeWunuS9kwogICAgICAgIHBpZWNlU2l6ZTogMywKICAgICAgICAvLyDliIbniYflpKflsI8KICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiBzdWNjZXNzKGRhdGEpIHsKICAgICAgICAgIF90aGlzMi5mb3JtVmFsaWRhdGUudmlkZW9fbGluayA9IGRhdGEuZmlsZV9wYXRoOwogICAgICAgICAgX3RoaXMyLnByb2dyZXNzID0gMTAwOwogICAgICAgIH0sCiAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKGUpIHsKICAgICAgICAgIF90aGlzMi4kTWVzc2FnZS5lcnJvcihlLm1zZyk7CiAgICAgICAgfSwKICAgICAgICB1cGxvYWRpbmc6IGZ1bmN0aW9uIHVwbG9hZGluZyhjaHVuaywgYWxsQ2h1bmspIHsKICAgICAgICAgIF90aGlzMi52aWRlb0luZyA9IHRydWU7CiAgICAgICAgICB2YXIgc3QgPSBNYXRoLmZsb29yKGNodW5rIC8gYWxsQ2h1bmsgKiAxMDApOwogICAgICAgICAgX3RoaXMyLnByb2dyZXNzID0gc3Q7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIC8vIOexu+Wei+mAieaLqS/loavlhaXlhoXlrrnliKTmlq0KICAgIHZpcnR1YWxidG46IGZ1bmN0aW9uIHZpcnR1YWxidG4oaW5kZXgsIHR5cGUpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgICBpZiAodHlwZSAhPSAxKSB7CiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfc3ViID0gW107CiAgICAgICAgdmFyIGlkID0gdGhpcy4kcm91dGUucGFyYW1zLmlkOwoKICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgIGNoZWNrQWN0aXZpdHlBcGkoaWQpLnRoZW4oZnVuY3Rpb24gKHJlcykge30pLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgX3RoaXMzLmZvcm1WYWxpZGF0ZS5zcGVjX3R5cGUgPSBfdGhpczMuc3BlY190eXBlOwoKICAgICAgICAgICAgX3RoaXMzLiRNZXNzYWdlLmVycm9yKHJlcy5tc2cpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID0gMDsKICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmlzX3ZpcnR1YWwgPSAwOwogICAgICAgICAgdGhpcy5oZWFkVGFiID0gW3sKICAgICAgICAgICAgdGl0OiAn5Z+656GA5L+h5oGvJywKICAgICAgICAgICAgbmFtZTogJzEnCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIHRpdDogJ+inhOagvOW6k+WtmCcsCiAgICAgICAgICAgIG5hbWU6ICcyJwogICAgICAgICAgfSwgewogICAgICAgICAgICB0aXQ6ICfllYblk4Hor6bmg4UnLAogICAgICAgICAgICBuYW1lOiAnMycKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdGl0OiAn54mp5rWB6K6+572uJywKICAgICAgICAgICAgbmFtZTogJzQnCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIHRpdDogJ+iQpemUgOiuvue9ricsCiAgICAgICAgICAgIG5hbWU6ICc1JwogICAgICAgICAgfSwgewogICAgICAgICAgICB0aXQ6ICflhbbku5borr7nva4nLAogICAgICAgICAgICBuYW1lOiAnNicKICAgICAgICAgIH1dOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9IDE7CiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5wb3N0YWdlID0gMDsKICAgICAgICAgIHRoaXMuaGVhZFRhYiA9IFt7CiAgICAgICAgICAgIHRpdDogJ+WfuuehgOS/oeaBrycsCiAgICAgICAgICAgIG5hbWU6ICcxJwogICAgICAgICAgfSwgewogICAgICAgICAgICB0aXQ6ICfop4TmoLzlupPlrZgnLAogICAgICAgICAgICBuYW1lOiAnMicKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdGl0OiAn5ZWG5ZOB6K+m5oOFJywKICAgICAgICAgICAgbmFtZTogJzMnCiAgICAgICAgICB9LCAvLyB7IHRpdDogIueJqea1geiuvue9riIsIG5hbWU6ICI0IiB9LAogICAgICAgICAgewogICAgICAgICAgICB0aXQ6ICfokKXplIDorr7nva4nLAogICAgICAgICAgICBuYW1lOiAnNCcKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdGl0OiAn5YW25LuW6K6+572uJywKICAgICAgICAgICAgbmFtZTogJzUnCiAgICAgICAgICB9XTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDI6CiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPSAyOwogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfdmlydHVhbCA9IDE7CiAgICAgICAgICB0aGlzLmhlYWRUYWIgPSBbewogICAgICAgICAgICB0aXQ6ICfln7rnoYDkv6Hmga8nLAogICAgICAgICAgICBuYW1lOiAnMScKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdGl0OiAn6KeE5qC85bqT5a2YJywKICAgICAgICAgICAgbmFtZTogJzInCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIHRpdDogJ+WVhuWTgeivpuaDhScsCiAgICAgICAgICAgIG5hbWU6ICczJwogICAgICAgICAgfSwgLy8geyB0aXQ6ICLnianmtYHorr7nva4iLCBuYW1lOiAiNCIgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgdGl0OiAn6JCl6ZSA6K6+572uJywKICAgICAgICAgICAgbmFtZTogJzQnCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIHRpdDogJ+WFtuS7luiuvue9ricsCiAgICAgICAgICAgIG5hbWU6ICc1JwogICAgICAgICAgfV07CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAzOgogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID0gMzsKICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmlzX3ZpcnR1YWwgPSAxOwogICAgICAgICAgdGhpcy5oZWFkVGFiID0gW3sKICAgICAgICAgICAgdGl0OiAn5Z+656GA5L+h5oGvJywKICAgICAgICAgICAgbmFtZTogJzEnCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIHRpdDogJ+inhOagvOW6k+WtmCcsCiAgICAgICAgICAgIG5hbWU6ICcyJwogICAgICAgICAgfSwgewogICAgICAgICAgICB0aXQ6ICfllYblk4Hor6bmg4UnLAogICAgICAgICAgICBuYW1lOiAnMycKICAgICAgICAgIH0sIC8vIHsgdGl0OiAi54mp5rWB6K6+572uIiwgbmFtZTogIjQiIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIHRpdDogJ+iQpemUgOiuvue9ricsCiAgICAgICAgICAgIG5hbWU6ICc0JwogICAgICAgICAgfSwgewogICAgICAgICAgICB0aXQ6ICflhbbku5borr7nva4nLAogICAgICAgICAgICBuYW1lOiAnNScKICAgICAgICAgIH1dOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9IDE7CiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pc192aXJ0dWFsID0gMTsgLy8gdGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlICA9MTsKCiAgICAgICAgICB0aGlzLmhlYWRUYWIgPSBbewogICAgICAgICAgICB0aXQ6ICfln7rnoYDkv6Hmga8nLAogICAgICAgICAgICBuYW1lOiAnMScKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdGl0OiAn6KeE5qC85bqT5a2YJywKICAgICAgICAgICAgbmFtZTogJzInCiAgICAgICAgICB9LCB7CiAgICAgICAgICAgIHRpdDogJ+WVhuWTgeivpuaDhScsCiAgICAgICAgICAgIG5hbWU6ICczJwogICAgICAgICAgfSwgewogICAgICAgICAgICB0aXQ6ICfokKXplIDorr7nva4nLAogICAgICAgICAgICBuYW1lOiAnNCcKICAgICAgICAgIH0sIHsKICAgICAgICAgICAgdGl0OiAn5YW25LuW6K6+572uJywKICAgICAgICAgICAgbmFtZTogJzUnCiAgICAgICAgICB9XTsKICAgICAgfQogICAgfSwKICAgIC8vIOaWsOWinuWIhuexuwogICAgYWRkQ2F0ZTogZnVuY3Rpb24gYWRkQ2F0ZSgpIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CgogICAgICB0aGlzLiRtb2RhbEZvcm0ocHJvZHVjdENyZWF0ZUFwaSgpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gX3RoaXM0Lmdvb2RzQ2F0ZWdvcnkoKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g54mp5rWB5pa55byP6YCJ5oupCiAgICBsb2dpc3RpY3NCdG46IGZ1bmN0aW9uIGxvZ2lzdGljc0J0bihlKSB7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmxvZ2lzdGljcyA9IGU7CiAgICB9LAogICAgLy8g5paw5aKe5qCH562+CiAgICBhZGRMYWJlbDogZnVuY3Rpb24gYWRkTGFiZWwoKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgICAgdGhpcy4kbW9kYWxGb3JtKHVzZXJMYWJlbEFkZEFwaSgwKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIF90aGlzNS51c2VyTGFiZWwoKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g6Ieq5a6a5LmJ55WZ6KiAIOW8gOWQr+WFs+mXrQogICAgY3VzdG9tTWVzc0J0bjogZnVuY3Rpb24gY3VzdG9tTWVzc0J0bihlKSB7CiAgICAgIGlmICghZSkgewogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtID0gW107CiAgICAgIH0KICAgIH0sCiAgICAvLyDoh6rlrprkuYnnlZnoqIAg5paw5aKe6KGo5Y2VCiAgICBhZGRjdXN0b206IGZ1bmN0aW9uIGFkZGN1c3RvbSgpIHsKICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtLmxlbmd0aCA+IDkpIHsKICAgICAgICB0aGlzLiRNZXNzYWdlLndhcm5pbmcoJ+acgOWkmua3u+WKoDEw5p2hJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuY3VzdG9tX2Zvcm0ucHVzaCh7CiAgICAgICAgICB0aXRsZTogJycsCiAgICAgICAgICBsYWJlbDogJ3RleHQnLAogICAgICAgICAgdmFsdWU6ICcnLAogICAgICAgICAgc3RhdHVzOiBmYWxzZQogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgLy8g5Yig6ZmkCiAgICBkZWxjdXN0b206IGZ1bmN0aW9uIGRlbGN1c3RvbShpbmRleCkgewogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybS5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKICAgIC8vIOmihOWUruWFt+S9k+aXpeacnwogICAgb25jaGFuZ2VUaW1lOiBmdW5jdGlvbiBvbmNoYW5nZVRpbWUoZSkgewogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5wcmVzYWxlX3RpbWUgPSBlOwogICAgfSwKICAgIC8vIOWVhuWTgeivpuaDhQogICAgZ2V0RWRpdG9yQ29udGVudDogZnVuY3Rpb24gZ2V0RWRpdG9yQ29udGVudChkYXRhKSB7CiAgICAgIHRoaXMuY29udGVudCA9IGRhdGE7CiAgICB9LAogICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7CiAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsKICAgICAgICBwYXRoOiAnL2FkbWluL3Byb2R1Y3QvcHJvZHVjdF9saXN0JwogICAgICB9KTsKICAgIH0sCiAgICAvLyDkuIrkvKDlpLTpg6h0b2tlbgogICAgZ2V0VG9rZW46IGZ1bmN0aW9uIGdldFRva2VuKCkgewogICAgICB0aGlzLmhlYWRlclsnQXV0aG9yaS16YXRpb24nXSA9ICdCZWFyZXIgJyArIGdldENvb2tpZXMoJ3Rva2VuJyk7CiAgICB9LAogICAgLy8g5a+85YWl5Y2h5a+GCiAgICB1cEZpbGU6IGZ1bmN0aW9uIHVwRmlsZShyZXMpIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CgogICAgICBpbXBvcnRDYXJkKHsKICAgICAgICBmaWxlOiByZXMuZGF0YS5zcmMKICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXM2LnZpcnR1YWxMaXN0ID0gX3RoaXM2LnZpcnR1YWxMaXN0LmNvbmNhdChyZXMuZGF0YSk7CiAgICAgIH0pOwogICAgfSwKICAgIC8v6I635Y+W6KeG6aKR5LiK5Lyg57G75Z6LCiAgICB1cGxvYWRUeXBlOiBmdW5jdGlvbiB1cGxvYWRUeXBlKCkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKCiAgICAgIF91cGxvYWRUeXBlKCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXM3LnVwbG9hZF90eXBlID0gcmVzLmRhdGEudXBsb2FkX3R5cGU7CiAgICAgIH0pOwogICAgfSwKICAgIC8vIOWIneWni+WMluaVsOaNruWxleekugogICAgaW5mb0RhdGE6IGZ1bmN0aW9uIGluZm9EYXRhKGRhdGEpIHsKICAgICAgdmFyIGNhdGVfaWQgPSBkYXRhLmNhdGVfaWQubWFwKE51bWJlcik7CiAgICAgIHZhciBsYWJlbF9pZCA9IGRhdGEubGFiZWxfaWQubWFwKE51bWJlcik7CiAgICAgIHRoaXMuYXR0cnMgPSBkYXRhLml0ZW1zIHx8IFtdOwogICAgICB2YXIgaWRzID0gW107CiAgICAgIGRhdGEuY291cG9ucy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICBpZHMucHVzaChpdGVtLmlkKTsKICAgICAgfSk7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlID0gZGF0YTsKICAgICAgdGhpcy5zZWxldFZpZGVvID0gZGF0YS5zZWxldFZpZGVvOwogICAgICB0aGlzLmNvbnRlbnRzID0gZGF0YS5kZXNjcmlwdGlvbjsKICAgICAgdGhpcy5jb3Vwb25OYW1lID0gZGF0YS5jb3Vwb25zOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jb3Vwb25faWRzID0gaWRzOwogICAgICB0aGlzLnVwZGF0ZUlkcyA9IGlkczsKICAgICAgdGhpcy5kYXRhTGFiZWwgPSBkYXRhLmxhYmVsX2lkOwogICAgICB0aGlzLnVwZGF0ZU5hbWUgPSBkYXRhLmNvdXBvbnM7CiAgICAgIHRoaXMudmlydHVhbGJ0bihkYXRhLnZpcnR1YWxfdHlwZSwgMSk7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmxvZ2lzdGljcyA9IGRhdGEubG9naXN0aWNzIHx8IFsnMSddOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybSA9IGRhdGEuY3VzdG9tX2Zvcm0gfHwgW107CgogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuY3VzdG9tX2Zvcm0ubGVuZ3RoICE9IDApIHsKICAgICAgICB0aGlzLmN1c3RvbUJ0biA9IHRydWU7CiAgICAgIH0KCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmNhdGVfaWQgPSBjYXRlX2lkOwoKICAgICAgaWYgKGRhdGEuYXR0cikgewogICAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlID0gW2RhdGEuYXR0cl07CiAgICAgIH0KCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmhlYWRlciA9IFtdOwogICAgICB0aGlzLmdlbmVyYXRlKDApOyAvLyB0aGlzLm1hbnlGb3JtVmFsaWRhdGUgPSBkYXRhLmF0dHJzOwoKICAgICAgdGhpcy4kc2V0KHRoaXMsICdtYW55Rm9ybVZhbGlkYXRlJywgZGF0YS5hdHRycyk7CiAgICAgIHRoaXMuc3BlY190eXBlID0gZGF0YS5zcGVjX3R5cGU7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmlzX3ZpcnR1YWwgPSBkYXRhLmlzX3ZpcnR1YWw7CgogICAgICBpZiAoZGF0YS5zcGVjX3R5cGUgPT09IDApIHsKICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUgPSBbXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNyZWF0ZUJudCA9IHRydWU7CiAgICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGUgPSBbewogICAgICAgICAgcGljOiAnJywKICAgICAgICAgIHByaWNlOiAwLAogICAgICAgICAgY29zdDogMCwKICAgICAgICAgIG90X3ByaWNlOiAwLAogICAgICAgICAgc3RvY2s6IDAsCiAgICAgICAgICBiYXJfY29kZTogJycsCiAgICAgICAgICB3ZWlnaHQ6IDAsCiAgICAgICAgICB2b2x1bWU6IDAsCiAgICAgICAgICBicm9rZXJhZ2U6IDAsCiAgICAgICAgICBicm9rZXJhZ2VfdHdvOiAwLAogICAgICAgICAgdmlwX3ByaWNlOiAwLAogICAgICAgICAgdmlydHVhbF9saXN0OiBbXSwKICAgICAgICAgIGNvdXBvbl9pZDogMAogICAgICAgIH1dOwogICAgICB9CiAgICB9LAogICAgLy/lhbPpl63mt5jlrp3lvLnnqpflubbnlJ/miJDmlbDmja7vvJsKICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoZGF0YSkgewogICAgICB0aGlzLm1vZGFscyA9IGZhbHNlOwogICAgICB0aGlzLmluZm9EYXRhKGRhdGEpOwogICAgfSwKICAgIGNoZWNrTW92ZTogZnVuY3Rpb24gY2hlY2tNb3ZlKGV2dCkgewogICAgICB0aGlzLm1vdmVJbmRleCA9IGV2dC5kcmFnZ2VkQ29udGV4dC5pbmRleDsKICAgIH0sCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCgpIHsKICAgICAgdGhpcy5tb3ZlSW5kZXggPSAnJzsKICAgIH0sCiAgICAvLyDljZXni6zorr7nva7kvJrlkZjorr7nva4KICAgIGNoZWNrQWxsR3JvdXBDaGFuZ2U6IGZ1bmN0aW9uIGNoZWNrQWxsR3JvdXBDaGFuZ2UoZGF0YSkgewogICAgICB0aGlzLmNoZWNrQWxsR3JvdXAoZGF0YSk7CiAgICB9LAogICAgY2hlY2tBbGxHcm91cDogZnVuY3Rpb24gY2hlY2tBbGxHcm91cChkYXRhKSB7CiAgICAgIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS5zcGVjX3R5cGUgPT09IDApIHsKICAgICAgICBpZiAoZGF0YS5pbmRleE9mKDApID4gLTEpIHsKICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbGwgPSB0aGlzLmNvbHVtbnMyLnNsaWNlKDAsIDQpLmNvbmNhdCh0aGlzLm1lbWJlcik7CiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmluZGV4T2YoMSkgPiAtMSkgewogICAgICAgICAgdGhpcy5jb2x1bW5zSW5zdGFsbCA9IHRoaXMuY29sdW1uczIuc2xpY2UoMCwgNCkuY29uY2F0KHRoaXMucmFrZUJhY2spOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWxsID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCA0KTsKICAgICAgICB9CgogICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMikgewogICAgICAgICAgdGhpcy5jb2x1bW5zSW5zdGFsbCA9IHRoaXMuY29sdW1uczIuc2xpY2UoMCwgNCkuY29uY2F0KHRoaXMucmFrZUJhY2spLmNvbmNhdCh0aGlzLm1lbWJlcik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChkYXRhLmluZGV4T2YoMCkgPiAtMSkgewogICAgICAgICAgdGhpcy5jb2x1bW5zSW5zdGFsMiA9IHRoaXMuY29sdW1uc0luc3RhbE0uc2xpY2UoMCwgNCkuY29uY2F0KHRoaXMubWVtYmVyKTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGEuaW5kZXhPZigxKSA+IC0xKSB7CiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWwyID0gdGhpcy5jb2x1bW5zSW5zdGFsTS5zbGljZSgwLCA0KS5jb25jYXQodGhpcy5yYWtlQmFjayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbDIgPSB0aGlzLmNvbHVtbnNJbnN0YWxNLnNsaWNlKDAsIDQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWwyID0gdGhpcy5jb2x1bW5zSW5zdGFsTS5zbGljZSgwLCA0KS5jb25jYXQodGhpcy5yYWtlQmFjaykuY29uY2F0KHRoaXMubWVtYmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAvLyDmt7vliqDkvJjmg6DliLgKICAgIGFkZENvdXBvbjogZnVuY3Rpb24gYWRkQ291cG9uKCkgewogICAgICB0aGlzLiRyZWZzLmNvdXBvblRlbXBsYXRlcy5pc1RlbXBsYXRlID0gdHJ1ZTsKICAgICAgdGhpcy4kcmVmcy5jb3Vwb25UZW1wbGF0ZXMudGFibGVMaXN0KCk7CiAgICB9LAogICAgLy8g6KeE5qC85Lit5LyY5oOg5Yi45p+l55yLCiAgICBzZWU6IGZ1bmN0aW9uIHNlZShkYXRhLCBuYW1lLCBpbmRleCkgewogICAgICB0aGlzLnRhYk5hbWUgPSBuYW1lOwogICAgICB0aGlzLnRhYkluZGV4ID0gaW5kZXg7CgogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID09PSAxKSB7CiAgICAgICAgaWYgKGRhdGEuZGlza19pbmZvICE9ICcnKSB7CiAgICAgICAgICB0aGlzLmRpc2tfdHlwZSA9IDE7CiAgICAgICAgICB0aGlzLmRpc2tfaW5mbyA9IGRhdGEuZGlza19pbmZvOwogICAgICAgICAgdGhpcy5zdG9jayA9IGRhdGEuc3RvY2s7CiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnZpcnR1YWxfbGlzdC5sZW5ndGgpIHsKICAgICAgICAgIHRoaXMuZGlza190eXBlID0gMjsKICAgICAgICAgIHRoaXMudmlydHVhbExpc3QgPSBkYXRhLnZpcnR1YWxfbGlzdDsKICAgICAgICB9CgogICAgICAgIHRoaXMuYWRkVmlydHVhbE1vZGVsID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLmlzVGVtcGxhdGUgPSB0cnVlOwogICAgICAgIHRoaXMuJHJlZnMuZ29vZHNDb3Vwb24udGFibGVMaXN0KDMpOwogICAgICB9CiAgICB9LAogICAgLy8g5re75Yqg5LyY5oOg5Yi4CiAgICBhZGRHb29kc0NvdXBvbjogZnVuY3Rpb24gYWRkR29vZHNDb3Vwb24oaW5kZXgsIG5hbWUpIHsKICAgICAgdGhpcy50YWJJbmRleCA9IGluZGV4OwogICAgICB0aGlzLnRhYk5hbWUgPSBuYW1lOwogICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLmlzVGVtcGxhdGUgPSB0cnVlOwogICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLnRhYmxlTGlzdCgzKTsKICAgIH0sCiAgICBhZGRWaXJ0dWFsOiBmdW5jdGlvbiBhZGRWaXJ0dWFsKGluZGV4LCBuYW1lKSB7CiAgICAgIHRoaXMudGFiSW5kZXggPSBpbmRleDsKICAgICAgdGhpcy50YWJOYW1lID0gbmFtZTsKICAgICAgdGhpcy5hZGRWaXJ0dWFsTW9kZWwgPSB0cnVlOwogICAgfSwKICAgIC8vIOaPkOS6pOWNoeWvhuS/oeaBrwogICAgdXBWaXJ0dWFsOiBmdW5jdGlvbiB1cFZpcnR1YWwoKSB7CiAgICAgIGlmICh0aGlzLmRpc2tfdHlwZSA9PSAyKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpcnR1YWxMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMudmlydHVhbExpc3RbaV07CgogICAgICAgICAgaWYgKCFlbGVtZW50LnZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuJE1lc3NhZ2UuZXJyb3IoJ+ivt+i+k+WFpeaJgOacieWNoeWvhicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAndmlydHVhbF9saXN0JywgdGhpcy52aXJ0dWFsTGlzdCk7CiAgICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ3N0b2NrJywgdGhpcy52aXJ0dWFsTGlzdC5sZW5ndGgpOwogICAgICAgIHRoaXMudmlydHVhbExpc3QgPSBbewogICAgICAgICAga2V5OiAnJywKICAgICAgICAgIHZhbHVlOiAnJwogICAgICAgIH1dOwogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdkaXNrX2luZm8nLCAnJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCF0aGlzLmRpc2tfaW5mby5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLiRNZXNzYWdlLmVycm9yKCfor7floavlhpnljaHlr4bkv6Hmga8nKTsKICAgICAgICB9CgogICAgICAgIGlmICghdGhpcy5zdG9jaykgewogICAgICAgICAgcmV0dXJuIHRoaXMuJE1lc3NhZ2UuZXJyb3IoJ+ivt+Whq+WGmeW6k+WtmOaVsOmHjycpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ3N0b2NrJywgTnVtYmVyKHRoaXMuc3RvY2spKTsKICAgICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAnc3RvY2snLCBOdW1iZXIodGhpcy5zdG9jaykpOwogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdkaXNrX2luZm8nLCB0aGlzLmRpc2tfaW5mbyk7CiAgICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ3ZpcnR1YWxfbGlzdCcsIFtdKTsKICAgICAgfQoKICAgICAgdGhpcy5hZGRWaXJ0dWFsTW9kZWwgPSBmYWxzZTsKICAgICAgdGhpcy5jbG9zZVZpcnR1YWwoKTsKICAgIH0sCiAgICAvLyAg5Yid5aeL5YyW5Y2h5a+G5pWw5o2u5L+h5oGvCiAgICBjbG9zZVZpcnR1YWw6IGZ1bmN0aW9uIGNsb3NlVmlydHVhbCgpIHsKICAgICAgdGhpcy5hZGRWaXJ0dWFsTW9kZWwgPSBmYWxzZTsKICAgICAgdGhpcy52aXJ0dWFsTGlzdCA9IFt7CiAgICAgICAga2V5OiAnJywKICAgICAgICB2YWx1ZTogJycKICAgICAgfV07CiAgICAgIHRoaXMuZGlza19pbmZvID0gJyc7CiAgICAgIHRoaXMuc3RvY2sgPSAwOwogICAgfSwKICAgIC8v5a+56LGh5pWw57uE5Y676YeN77ybCiAgICB1bmlxdWU6IGZ1bmN0aW9uIHVuaXF1ZShhcnIpIHsKICAgICAgdmFyIHJlcyA9IG5ldyBNYXAoKTsKICAgICAgcmV0dXJuIGFyci5maWx0ZXIoZnVuY3Rpb24gKGFycikgewogICAgICAgIHJldHVybiAhcmVzLmhhcyhhcnIuaWQpICYmIHJlcy5zZXQoYXJyLmlkLCAxKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g6I635Y+W5LyY5oOg5Yi4aWTmlbDmja4KICAgIG5hbWVJZDogZnVuY3Rpb24gbmFtZUlkKGlkLCBuYW1lcykgewogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jb3Vwb25faWRzID0gaWQ7CiAgICAgIHRoaXMuY291cG9uTmFtZSA9IHRoaXMudW5pcXVlKG5hbWVzKTsKICAgIH0sCiAgICAvLyDojrflj5bkvJjmg6DliLjkv6Hmga8KICAgIGdvb2RzQ291cG9uSWQ6IGZ1bmN0aW9uIGdvb2RzQ291cG9uSWQoZGF0YSkgewogICAgICAvLyB0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0uY291cG9uX2lkID0gZGF0YS5pZDsKICAgICAgLy8gdGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLmNvdXBvbl9uYW1lID0gZGF0YS50aXRsZTsKICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ2NvdXBvbl9pZCcsIGRhdGEuaWQpOwogICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAnY291cG9uX25hbWUnLCBkYXRhLnRpdGxlKTsKICAgICAgdGhpcy4kcmVmcy5nb29kc0NvdXBvbi5pc1RlbXBsYXRlID0gZmFsc2U7CiAgICB9LAogICAgaGFuZGxlQ2xvc2U6IGZ1bmN0aW9uIGhhbmRsZUNsb3NlKG5hbWUpIHsKICAgICAgdmFyIGluZGV4ID0gdGhpcy5jb3Vwb25OYW1lLmluZGV4T2YobmFtZSk7CiAgICAgIHRoaXMuY291cG9uTmFtZS5zcGxpY2UoaW5kZXgsIDEpOwogICAgICB2YXIgY291cG9uSWRzID0gdGhpcy5mb3JtVmFsaWRhdGUuY291cG9uX2lkczsKICAgICAgY291cG9uSWRzLnNwbGljZShpbmRleCwgMSk7CiAgICAgIHRoaXMudXBkYXRlSWRzID0gY291cG9uSWRzOwogICAgICB0aGlzLnVwZGF0ZU5hbWUgPSB0aGlzLmNvdXBvbk5hbWU7CiAgICB9LAogICAgLy8g6L+Q6LS55qih5p2/CiAgICBnZXRMaXN0OiBmdW5jdGlvbiBnZXRMaXN0KCkgewogICAgICB0aGlzLnByb2R1Y3RHZXRUZW1wbGF0ZSgpOwogICAgfSwKICAgIC8vIOa3u+WKoOi/kOi0ueaooeadvwogICAgYWRkVGVtcDogZnVuY3Rpb24gYWRkVGVtcCgpIHsKICAgICAgdGhpcy4kcmVmcy50ZW1wbGF0ZXMuaXNUZW1wbGF0ZSA9IHRydWU7CiAgICB9LAogICAgLy8g5Yig6Zmk6KeG6aKR77ybCiAgICBkZWxWaWRlbzogZnVuY3Rpb24gZGVsVmlkZW8oKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgdGhhdC4kc2V0KHRoYXQuZm9ybVZhbGlkYXRlLCAndmlkZW9fbGluaycsICcnKTsKICAgICAgdGhhdC4kc2V0KHRoYXQsICdwcm9ncmVzcycsIDApOwogICAgICB0aGF0LnZpZGVvSW5nID0gZmFsc2U7CiAgICAgIHRoYXQudXBsb2FkLnZpZGVvSW5nID0gZmFsc2U7CiAgICB9LAogICAgemhfdXBsb2FkRmlsZTogZnVuY3Rpb24gemhfdXBsb2FkRmlsZSgpIHsKICAgICAgaWYgKHRoaXMuc2VsZXRWaWRlbyA9PSAxKSB7CiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUudmlkZW9fbGluayA9IHRoaXMudmlkZW9MaW5rOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuJHJlZnMucmVmaWQuY2xpY2soKTsKICAgICAgfQogICAgfSwKICAgIC8vIOS4iuS8oOinhumikQogICAgemhfdXBsb2FkRmlsZV9jaGFuZ2U6IGZ1bmN0aW9uIHpoX3VwbG9hZEZpbGVfY2hhbmdlKGV2ZmlsZSkgewogICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgIHZhciBzdWZmaXggPSBldmZpbGUudGFyZ2V0LmZpbGVzWzBdLm5hbWUuc3Vic3RyKGV2ZmlsZS50YXJnZXQuZmlsZXNbMF0ubmFtZS5pbmRleE9mKCcuJykpOwoKICAgICAgaWYgKHN1ZmZpeC5pbmRleE9mKCcubXA0JykgPT09IC0xKSB7CiAgICAgICAgcmV0dXJuIHRoYXQuJE1lc3NhZ2UuZXJyb3IoJ+WPquiDveS4iuS8oE1QNOaWh+S7ticpOwogICAgICB9CgogICAgICBwcm9kdWN0R2V0VGVtcEtleXNBcGkoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBjb25zb2xlLmxvZyhyZXMsICc/PycpOwogICAgICAgIHRoYXQuJHZpZGVvQ2xvdWQudmlkZW9VcGxvYWQoewogICAgICAgICAgdHlwZTogcmVzLmRhdGEudHlwZSwKICAgICAgICAgIGV2ZmlsZTogZXZmaWxlLAogICAgICAgICAgcmVzOiByZXMsCiAgICAgICAgICB1cGxvYWRpbmc6IGZ1bmN0aW9uIHVwbG9hZGluZyhzdGF0dXMsIHByb2dyZXNzKSB7CiAgICAgICAgICAgIHRoYXQudXBsb2FkLnZpZGVvSW5nID0gc3RhdHVzOwoKICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgdGhhdC5wcm9ncmVzcyA9IDEwMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgdGhhdC5mb3JtVmFsaWRhdGUudmlkZW9fbGluayA9IHJlcy51cmw7CiAgICAgICAgICB0aGF0LiRNZXNzYWdlLnN1Y2Nlc3MoJ+inhumikeS4iuS8oOaIkOWKnycpOwogICAgICAgICAgdGhhdC51cGxvYWQudmlkZW9JbmcgPSBmYWxzZTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICB0aGF0LiRNZXNzYWdlLmVycm9yKHJlcyk7CiAgICAgICAgfSk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB0aGF0LiRNZXNzYWdlLmVycm9yKHJlcy5tc2cpOwogICAgICB9KTsKICAgIH0sCiAgICAvLyDkuIrkuIDpobXvvJsKICAgIHVwVGFiOiBmdW5jdGlvbiB1cFRhYigpIHsKICAgICAgdGhpcy5jdXJyZW50VGFiID0gKE51bWJlcih0aGlzLmN1cnJlbnRUYWIpIC0gMSkudG9TdHJpbmcoKTsKICAgIH0sCiAgICAvLyDkuIvkuIDpobXvvJsKICAgIGRvd25UYWI6IGZ1bmN0aW9uIGRvd25UYWIoKSB7CiAgICAgIHRoaXMuY3VycmVudFRhYiA9IChOdW1iZXIodGhpcy5jdXJyZW50VGFiKSArIDEpLnRvU3RyaW5nKCk7CiAgICB9LAogICAgLy8g5bGe5oCn5by556qX5Zue6LCD5Ye95pWw77ybCiAgICB1c2VyU2VhcmNoczogZnVuY3Rpb24gdXNlclNlYXJjaHMoKSB7CiAgICAgIHRoaXMucHJvZHVjdEdldFJ1bGUoKTsKICAgIH0sCiAgICAvLyDmt7vliqDop4TliJnvvJsKICAgIGFkZFJ1bGU6IGZ1bmN0aW9uIGFkZFJ1bGUoKSB7CiAgICAgIHRoaXMuJHJlZnMuYWRkYXR0ci5tb2RhbCA9IHRydWU7CiAgICB9LAogICAgLy8g5om56YeP6K6+572u5YiG5L2j77ybCiAgICBicm9rZXJhZ2VTZXRVcDogZnVuY3Rpb24gYnJva2VyYWdlU2V0VXAoKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpczsKCiAgICAgIGlmICh0aGF0LmZvcm1WYWxpZGF0ZS5pc19zdWIuaW5kZXhPZigxKSA+IC0xKSB7CiAgICAgICAgaWYgKHRoYXQubWFueUJyb2tlcmFnZSA8PSAwIHx8IHRoYXQubWFueUJyb2tlcmFnZVR3byA8PSAwKSB7CiAgICAgICAgICByZXR1cm4gdGhhdC4kTWVzc2FnZS5lcnJvcign6K+35aGr5YaZ6L+U5L2j6YeR6aKd5ZCO6L+b6KGM5om56YeP5re75YqgJyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoYXQuZm9ybVZhbGlkYXRlLmlzX3N1Yi5pbmRleE9mKDApID4gLTEpIHsKICAgICAgICBpZiAodGhhdC5tYW55VmlwUHJpY2UgPD0gMCkgewogICAgICAgICAgcmV0dXJuIHRoYXQuJE1lc3NhZ2UuZXJyb3IoJ+ivt+Whq+WGmeS8muWRmOS7t+WQjui/m+ihjOaJuemHj+a3u+WKoCcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmlzX3N1Yi5sZW5ndGggPT09IDIpIHsKICAgICAgICBpZiAodGhhdC5tYW55QnJva2VyYWdlIDw9IDAgfHwgdGhhdC5tYW55QnJva2VyYWdlVHdvIDw9IDAgfHwgdGhhdC5tYW55VmlwUHJpY2UgPD0gMCkgewogICAgICAgICAgcmV0dXJuIHRoYXQuJE1lc3NhZ2UuZXJyb3IoJ+ivt+Whq+WGmeWujOmHkemineWQjui/m+ihjOaJuemHj+a3u+WKoCcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoYXQubWFueUZvcm1WYWxpZGF0ZSksCiAgICAgICAgICBfc3RlcDsKCiAgICAgIHRyeSB7CiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHsKICAgICAgICAgIHZhciB2YWwgPSBfc3RlcC52YWx1ZTsKICAgICAgICAgIHRoaXMuJHNldCh2YWwsICdicm9rZXJhZ2UnLCB0aGF0Lm1hbnlCcm9rZXJhZ2UpOwogICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ2Jyb2tlcmFnZV90d28nLCB0aGF0Lm1hbnlCcm9rZXJhZ2VUd28pOwogICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3ZpcF9wcmljZScsIHRoYXQubWFueVZpcFByaWNlKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIF9pdGVyYXRvci5lKGVycik7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgX2l0ZXJhdG9yLmYoKTsKICAgICAgfQogICAgfSwKICAgIC8vIOaJuemHj+iuvue9ruS8muWRmOS7twogICAgdmlwUHJpY2VTZXRVcDogZnVuY3Rpb24gdmlwUHJpY2VTZXRVcCgpIHsKICAgICAgdmFyIHRoYXQgPSB0aGlzOwoKICAgICAgaWYgKHRoYXQubWFueVZpcFByaWNlIDw9IDApIHsKICAgICAgICByZXR1cm4gdGhhdC4kTWVzc2FnZS5lcnJvcign6K+35aGr5YaZ5Lya5ZGY5Lu35Zyo6L+b6KGM5om56YeP5re75YqgJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGF0Lm1hbnlGb3JtVmFsaWRhdGUpLAogICAgICAgICAgICBfc3RlcDI7CgogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykgewogICAgICAgICAgICB2YXIgdmFsID0gX3N0ZXAyLnZhbHVlOwogICAgICAgICAgICB0aGlzLiRzZXQodmFsLCAndmlwX3ByaWNlJywgdGhhdC5tYW55VmlwUHJpY2UpOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIF9pdGVyYXRvcjIuZigpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIC8vIOaWsOWinuWNoeWvhgogICAgaGFuZGxlQWRkOiBmdW5jdGlvbiBoYW5kbGVBZGQoKSB7CiAgICAgIHRoaXMudmlydHVhbExpc3QucHVzaCh7CiAgICAgICAga2V5OiAnJywKICAgICAgICB2YWx1ZTogJycKICAgICAgfSk7CiAgICB9LAogICAgLy8g5Yid5aeL5YyW5Y2h5a+G5L+h5oGvCiAgICBpbml0VmlydHVhbERhdGE6IGZ1bmN0aW9uIGluaXRWaXJ0dWFsRGF0YShzdGF0dXMpIHsKICAgICAgaWYgKCFzdGF0dXMpIHsKICAgICAgICB0aGlzLnZpcnR1YWxMaXN0ID0gW3sKICAgICAgICAgIGtleTogJycsCiAgICAgICAgICB2YWx1ZTogJycKICAgICAgICB9XTsKICAgICAgfQogICAgfSwKICAgIHJlbW92ZVZpcnR1YWw6IGZ1bmN0aW9uIHJlbW92ZVZpcnR1YWwoaW5kZXgpIHsKICAgICAgdGhpcy52aXJ0dWFsTGlzdC5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKICAgIC8vIOa4heepuuaJuemHj+inhOagvOS/oeaBrwogICAgYmF0Y2hEZWw6IGZ1bmN0aW9uIGJhdGNoRGVsKCkgewogICAgICB0aGlzLm9uZUZvcm1CYXRjaCA9IFt7CiAgICAgICAgcGljOiAnJywKICAgICAgICBwcmljZTogMCwKICAgICAgICBjb3N0OiAwLAogICAgICAgIG90X3ByaWNlOiAwLAogICAgICAgIHN0b2NrOiAwLAogICAgICAgIGJhcl9jb2RlOiAnJywKICAgICAgICB3ZWlnaHQ6IDAsCiAgICAgICAgdm9sdW1lOiAwCiAgICAgIH1dOwogICAgfSwKICAgIGNvbmZpcm06IGZ1bmN0aW9uIGNvbmZpcm0oKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgdGhhdC5jcmVhdGVCbnQgPSB0cnVlOwoKICAgICAgaWYgKHRoYXQuZm9ybVZhbGlkYXRlLnNlbGVjdFJ1bGUudHJpbSgpLmxlbmd0aCA8PSAwKSB7CiAgICAgICAgcmV0dXJuIHRoYXQuJE1lc3NhZ2UuZXJyb3IoJ+ivt+mAieaLqeWxnuaApycpOwogICAgICB9CgogICAgICB0aGF0LnJ1bGVMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgaWYgKGl0ZW0ucnVsZV9uYW1lID09PSB0aGF0LmZvcm1WYWxpZGF0ZS5zZWxlY3RSdWxlKSB7CiAgICAgICAgICB0aGF0LmF0dHJzID0gaXRlbS5ydWxlX3ZhbHVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgLy8g6I635Y+W5ZWG5ZOB5bGe5oCn5qih5p2/77ybCiAgICBwcm9kdWN0R2V0UnVsZTogZnVuY3Rpb24gcHJvZHVjdEdldFJ1bGUoKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwoKICAgICAgcHJvZHVjdEdldFJ1bGVBcGkoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczgucnVsZUxpc3QgPSByZXMuZGF0YTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g6I635Y+W6L+Q6LS55qih5p2/77ybCiAgICBwcm9kdWN0R2V0VGVtcGxhdGU6IGZ1bmN0aW9uIHByb2R1Y3RHZXRUZW1wbGF0ZSgpIHsKICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CgogICAgICBwcm9kdWN0R2V0VGVtcGxhdGVBcGkoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczkudGVtcGxhdGVMaXN0ID0gcmVzLmRhdGE7CiAgICAgIH0pOwogICAgfSwKICAgIC8vIOWIoOmZpOihqOagvOS4reeahOWxnuaApwogICAgZGVsQXR0clRhYmxlOiBmdW5jdGlvbiBkZWxBdHRyVGFibGUoaW5kZXgpIHsKICAgICAgdmFyIF90aGlzMTAgPSB0aGlzOwoKICAgICAgdmFyIGlkID0gdGhpcy4kcm91dGUucGFyYW1zLmlkOwoKICAgICAgaWYgKGlkKSB7CiAgICAgICAgY2hlY2tBY3Rpdml0eUFwaShpZCkudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICBfdGhpczEwLm1hbnlGb3JtVmFsaWRhdGUuc3BsaWNlKGluZGV4LCAxKTsKCiAgICAgICAgICBfdGhpczEwLiRNZXNzYWdlLnN1Y2Nlc3MocmVzLm1zZyk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgX3RoaXMxMC4kTWVzc2FnZS5lcnJvcihyZXMubXNnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgfQogICAgfSwKICAgIC8vIOaJuemHj+a3u+WKoAogICAgYmF0Y2hBZGQ6IGZ1bmN0aW9uIGJhdGNoQWRkKCkgewogICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMubWFueUZvcm1WYWxpZGF0ZSksCiAgICAgICAgICBfc3RlcDM7CgogICAgICB0cnkgewogICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7CiAgICAgICAgICB2YXIgdmFsID0gX3N0ZXAzLnZhbHVlOwoKICAgICAgICAgIGlmICh0aGlzLm9uZUZvcm1CYXRjaFswXS5waWMpIHsKICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3BpYycsIHRoaXMub25lRm9ybUJhdGNoWzBdLnBpYyk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub25lRm9ybUJhdGNoWzBdLnByaWNlID4gMCkgewogICAgICAgICAgICB0aGlzLiRzZXQodmFsLCAncHJpY2UnLCB0aGlzLm9uZUZvcm1CYXRjaFswXS5wcmljZSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub25lRm9ybUJhdGNoWzBdLmNvc3QgPiAwKSB7CiAgICAgICAgICAgIHRoaXMuJHNldCh2YWwsICdjb3N0JywgdGhpcy5vbmVGb3JtQmF0Y2hbMF0uY29zdCk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub25lRm9ybUJhdGNoWzBdLm90X3ByaWNlID4gMCkgewogICAgICAgICAgICB0aGlzLiRzZXQodmFsLCAnb3RfcHJpY2UnLCB0aGlzLm9uZUZvcm1CYXRjaFswXS5vdF9wcmljZSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub25lRm9ybUJhdGNoWzBdLnN0b2NrID4gMCkgewogICAgICAgICAgICB0aGlzLiRzZXQodmFsLCAnc3RvY2snLCB0aGlzLm9uZUZvcm1CYXRjaFswXS5zdG9jayk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub25lRm9ybUJhdGNoWzBdLmJhcl9jb2RlICE9PSAnJykgewogICAgICAgICAgICB0aGlzLiRzZXQodmFsLCAnYmFyX2NvZGUnLCB0aGlzLm9uZUZvcm1CYXRjaFswXS5iYXJfY29kZSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub25lRm9ybUJhdGNoWzBdLndlaWdodCA+IDApIHsKICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3dlaWdodCcsIHRoaXMub25lRm9ybUJhdGNoWzBdLndlaWdodCk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMub25lRm9ybUJhdGNoWzBdLnZvbHVtZSA+IDApIHsKICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3ZvbHVtZScsIHRoaXMub25lRm9ybUJhdGNoWzBdLnZvbHVtZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBfaXRlcmF0b3IzLmYoKTsKICAgICAgfQogICAgfSwKICAgIC8vIOa3u+WKoOaMiemSrgogICAgYWRkQnRuOiBmdW5jdGlvbiBhZGRCdG4oKSB7CiAgICAgIHRoaXMuY2xlYXJBdHRyKCk7CiAgICAgIHRoaXMuY3JlYXRlQm50ID0gZmFsc2U7CiAgICAgIHRoaXMuc2hvd0lwdXQgPSB0cnVlOwogICAgfSwKICAgIC8vIOeri+WNs+eUn+aIkAogICAgZ2VuZXJhdGU6IGZ1bmN0aW9uIGdlbmVyYXRlKHR5cGUpIHsKICAgICAgdmFyIF90aGlzMTEgPSB0aGlzOwoKICAgICAgZ2VuZXJhdGVBdHRyQXBpKHsKICAgICAgICBhdHRyczogdGhpcy5hdHRycywKICAgICAgICBpc192aXJ0dWFsOiBbMSwgMl0uaW5jbHVkZXModGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlKSA/IDEgOiAwLAogICAgICAgIHZpcnR1YWxfdHlwZTogdGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlCiAgICAgIH0sIHRoaXMuZm9ybVZhbGlkYXRlLmlkLCB0eXBlKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB2YXIgaW5mbyA9IHJlcy5kYXRhLmluZm8sCiAgICAgICAgICAgIGhlYWRlcjEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGluZm8uaGVhZGVyKSk7CgogICAgICAgIGlmIChfdGhpczExLiRyb3V0ZS5wYXJhbXMuaWQgIT09ICcwJyAmJiAoX3RoaXMxMS4kcm91dGUucXVlcnkudHlwZSAhPSAtMSB8fCB0eXBlKSkgewogICAgICAgICAgX3RoaXMxMS5tYW55Rm9ybVZhbGlkYXRlID0gaW5mby52YWx1ZTsKICAgICAgICB9CgogICAgICAgIHZhciBoZWFkZXIgPSBpbmZvLmhlYWRlcjsKCiAgICAgICAgaWYgKFsxLCAyXS5pbmNsdWRlcyhfdGhpczExLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUpKSB7CiAgICAgICAgICBfdGhpczExLmNvbHVtbnNJbnN0YWxNID0gaGVhZGVyOwogICAgICAgICAgX3RoaXMxMS5mb3JtVmFsaWRhdGUuaGVhZGVyID0gaGVhZGVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpczExLmZvcm1WYWxpZGF0ZS5oZWFkZXIgPSBoZWFkZXIxOwogICAgICAgICAgX3RoaXMxMS5jb2x1bW5zSW5zdGFsTSA9IGluZm8uaGVhZGVyOwogICAgICAgIH0KCiAgICAgICAgX3RoaXMxMS5jaGVja0FsbEdyb3VwKF90aGlzMTEuZm9ybVZhbGlkYXRlLmlzX3N1Yik7CgogICAgICAgIGlmICghX3RoaXMxMS4kcm91dGUucGFyYW1zLmlkICYmIF90aGlzMTEuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9PT0gMSkgewogICAgICAgICAgX3RoaXMxMS5tYW55Rm9ybVZhbGlkYXRlLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICBpdGVtLnBpYyA9IF90aGlzMTEuZm9ybVZhbGlkYXRlLmltYWdlOwogICAgICAgICAgfSk7CgogICAgICAgICAgX3RoaXMxMS5vbmVGb3JtQmF0Y2hbMF0ucGljID0gX3RoaXMxMS5mb3JtVmFsaWRhdGUuaW1hZ2U7CiAgICAgICAgfSBlbHNlIGlmIChfdGhpczExLiRyb3V0ZS5wYXJhbXMuaWQpIHsKICAgICAgICAgIF90aGlzMTEubWFueUZvcm1WYWxpZGF0ZS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgaWYgKCFpdGVtLnBpYykgewogICAgICAgICAgICAgIGl0ZW0ucGljID0gX3RoaXMxMS5mb3JtVmFsaWRhdGUuaW1hZ2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIF90aGlzMTEub25lRm9ybUJhdGNoWzBdLnBpYyA9IF90aGlzMTEuZm9ybVZhbGlkYXRlLmltYWdlOwogICAgICAgIH0KICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgIF90aGlzMTEuJE1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgIH0pOwogICAgfSwKICAgIC8vIOWPlua2iAogICAgb2ZmQXR0ck5hbWU6IGZ1bmN0aW9uIG9mZkF0dHJOYW1lKCkgewogICAgICB0aGlzLnNob3dJcHV0ID0gZmFsc2U7CiAgICAgIHRoaXMuY3JlYXRlQm50ID0gdHJ1ZTsKICAgIH0sCiAgICBjbGVhckF0dHI6IGZ1bmN0aW9uIGNsZWFyQXR0cigpIHsKICAgICAgdGhpcy5mb3JtRHluYW1pYy5hdHRyc05hbWUgPSAnJzsKICAgICAgdGhpcy5mb3JtRHluYW1pYy5hdHRyc1ZhbCA9ICcnOwogICAgfSwKICAgIC8vIOWIoOmZpOinhOagvAogICAgaGFuZGxlUmVtb3ZlUm9sZTogZnVuY3Rpb24gaGFuZGxlUmVtb3ZlUm9sZShpbmRleCkgewogICAgICB0aGlzLmF0dHJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZS5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKICAgIC8vIOWIoOmZpOWxnuaApwogICAgaGFuZGxlUmVtb3ZlMjogZnVuY3Rpb24gaGFuZGxlUmVtb3ZlMihpdGVtLCBpbmRleCkgewogICAgICBpdGVtLnNwbGljZShpbmRleCwgMSk7CiAgICB9LAogICAgLy8g5re75Yqg6KeE5YiZ5ZCN56ewCiAgICBjcmVhdGVBdHRyTmFtZTogZnVuY3Rpb24gY3JlYXRlQXR0ck5hbWUoKSB7CiAgICAgIGlmICh0aGlzLmZvcm1EeW5hbWljLmF0dHJzTmFtZSAmJiB0aGlzLmZvcm1EeW5hbWljLmF0dHJzVmFsKSB7CiAgICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtRHluYW1pYy5hdHRyc05hbWUsCiAgICAgICAgICBkZXRhaWw6IFt0aGlzLmZvcm1EeW5hbWljLmF0dHJzVmFsXQogICAgICAgIH07CiAgICAgICAgdGhpcy5hdHRycy5wdXNoKGRhdGEpOwogICAgICAgIHZhciBoYXNoID0ge307CiAgICAgICAgdGhpcy5hdHRycyA9IHRoaXMuYXR0cnMucmVkdWNlKGZ1bmN0aW9uIChpdGVtLCBuZXh0KSB7CiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSAqLwogICAgICAgICAgaGFzaFtuZXh0LnZhbHVlXSA/ICcnIDogaGFzaFtuZXh0LnZhbHVlXSA9IHRydWUgJiYgaXRlbS5wdXNoKG5leHQpOwogICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgICAgfSwgW10pOwogICAgICAgIHRoaXMuY2xlYXJBdHRyKCk7CiAgICAgICAgdGhpcy5zaG93SXB1dCA9IGZhbHNlOwogICAgICAgIHRoaXMuY3JlYXRlQm50ID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLiRNZXNzYWdlLndhcm5pbmcoJ+ivt+a3u+WKoOWujOaVtOeahOinhOagvO+8gScpOwogICAgICB9CiAgICB9LAogICAgLy8g5re75Yqg5bGe5oCnCiAgICBjcmVhdGVBdHRyOiBmdW5jdGlvbiBjcmVhdGVBdHRyKG51bSwgaWR4KSB7CiAgICAgIGlmIChudW0pIHsKICAgICAgICB0aGlzLmF0dHJzW2lkeF0uZGV0YWlsLnB1c2gobnVtKTsKICAgICAgICB2YXIgaGFzaCA9IHt9OwogICAgICAgIHRoaXMuYXR0cnNbaWR4XS5kZXRhaWwgPSB0aGlzLmF0dHJzW2lkeF0uZGV0YWlsLnJlZHVjZShmdW5jdGlvbiAoaXRlbSwgbmV4dCkgewogICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi8KICAgICAgICAgIGhhc2hbbmV4dF0gPyAnJyA6IGhhc2hbbmV4dF0gPSB0cnVlICYmIGl0ZW0ucHVzaChuZXh0KTsKICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgIH0sIFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLiRNZXNzYWdlLndhcm5pbmcoJ+ivt+a3u+WKoOWxnuaApycpOwogICAgICB9CiAgICB9LAogICAgLy8g5ZWG5ZOB5YiG57G777ybCiAgICBnb29kc0NhdGVnb3J5OiBmdW5jdGlvbiBnb29kc0NhdGVnb3J5KCkgewogICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7CgogICAgICB0cmVlTGlzdEFwaSgxKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczEyLnRyZWVTZWxlY3QgPSByZXMuZGF0YTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgIF90aGlzMTIuJE1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgIH0pOwogICAgfSwKICAgIC8v6KeG6KeG5LiK5Lyg57G75Z6LCiAgICBjaGFuZ2VWaWRlbzogZnVuY3Rpb24gY2hhbmdlVmlkZW8oZSkgewogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS52aWRlb19saW5rID0gJyc7CiAgICAgIHRoaXMudmlkZW9MaW5rID0gJyc7CiAgICB9LAogICAgLy8g5pS55Y+Y6KeE5qC8CiAgICBjaGFuZ2VTcGVjOiBmdW5jdGlvbiBjaGFuZ2VTcGVjKCkgewogICAgICB2YXIgX3RoaXMxMyA9IHRoaXM7CgogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pc19zdWIgPSBbXTsKICAgICAgdmFyIGlkID0gdGhpcy4kcm91dGUucGFyYW1zLmlkOwoKICAgICAgaWYgKGlkKSB7CiAgICAgICAgY2hlY2tBY3Rpdml0eUFwaShpZCkudGhlbihmdW5jdGlvbiAocmVzKSB7fSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgX3RoaXMxMy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID0gX3RoaXMxMy5zcGVjX3R5cGU7CgogICAgICAgICAgX3RoaXMxMy4kTWVzc2FnZS5lcnJvcihyZXMubXNnKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIC8vIOivpuaDhQogICAgZ2V0SW5mbzogZnVuY3Rpb24gZ2V0SW5mbygpIHsKICAgICAgdmFyIF90aGlzMTQgPSB0aGlzOwoKICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICB0aGF0LnNwaW5TaG93ID0gdHJ1ZTsKICAgICAgcHJvZHVjdEluZm9BcGkodGhhdC4kcm91dGUucGFyYW1zLmlkKS50aGVuKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHJlcykgewogICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXMuZGF0YS5wcm9kdWN0SW5mbzsKCiAgICAgICAgICAgICAgICAgIF90aGlzMTQuaW5mb0RhdGEoZGF0YSk7CgogICAgICAgICAgICAgICAgICBfdGhpczE0LnNwaW5TaG93ID0gZmFsc2U7CgogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUpOwogICAgICAgIH0pKTsKCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeCkgewogICAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgICB9KCkpLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczE0LnNwaW5TaG93ID0gZmFsc2U7CgogICAgICAgIF90aGlzMTQuJE1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CiAgICAgIH0pOwogICAgfSwKICAgIC8vIHRhYuWIh+aNogogICAgb25oYW5nZVRhYjogZnVuY3Rpb24gb25oYW5nZVRhYihuYW1lKSB7CiAgICAgIHRoaXMuY3VycmVudFRhYiA9IG5hbWU7CiAgICB9LAogICAgaGFuZGxlUmVtb3ZlOiBmdW5jdGlvbiBoYW5kbGVSZW1vdmUoaSkgewogICAgICB0aGlzLmltYWdlcy5zcGxpY2UoaSwgMSk7CiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZS5zcGxpY2UoaSwgMSk7CiAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlWzBdLnBpYyA9IHRoaXMuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZVswXTsKICAgIH0sCiAgICAvLyDlhbPpl63lm77niYfkuIrkvKDmqKHmgIHmoYYKICAgIGNoYW5nZUNhbmNlbDogZnVuY3Rpb24gY2hhbmdlQ2FuY2VsKG1zZykgewogICAgICB0aGlzLm1vZGFsUGljID0gZmFsc2U7CiAgICB9LAogICAgLy8g54K55Ye75ZWG5ZOB5Zu+CiAgICBtb2RhbFBpY1RhcDogZnVuY3Rpb24gbW9kYWxQaWNUYXAodGl0LCBwaWNUaXQsIGluZGV4KSB7CiAgICAgIHRoaXMubW9kYWxQaWMgPSB0cnVlOwogICAgICB0aGlzLmlzQ2hvaWNlID0gdGl0ID09PSAnZGFuJyA/ICfljZXpgIknIDogJ+WkmumAiSc7CiAgICAgIHRoaXMucGljVGl0ID0gcGljVGl0OwogICAgICB0aGlzLnRhYmxlSW5kZXggPSBpbmRleDsKICAgIH0sCiAgICAvLyDojrflj5bljZXlvKDlm77niYfkv6Hmga8KICAgIGdldFBpYzogZnVuY3Rpb24gZ2V0UGljKHBjKSB7CiAgICAgIHN3aXRjaCAodGhpcy5waWNUaXQpIHsKICAgICAgICBjYXNlICdkYW5Gcm9tJzoKICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmltYWdlID0gcGMuYXR0X2RpcjsKCiAgICAgICAgICBpZiAoIXRoaXMuJHJvdXRlLnBhcmFtcy5pZCkgewogICAgICAgICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0ucGljID0gcGMuYXR0X2RpcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICBpdGVtLnBpYyA9IHBjLmF0dF9kaXI7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgdGhpcy5vbmVGb3JtQmF0Y2hbMF0ucGljID0gcGMuYXR0X2RpcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdkYW5UYWJsZSc6CiAgICAgICAgICB0aGlzLm9uZUZvcm1WYWxpZGF0ZVt0aGlzLnRhYmxlSW5kZXhdLnBpYyA9IHBjLmF0dF9kaXI7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnZHVvcGknOgogICAgICAgICAgdGhpcy5vbmVGb3JtQmF0Y2hbdGhpcy50YWJsZUluZGV4XS5waWMgPSBwYy5hdHRfZGlyOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3JlY29tbWVuZF9pbWFnZSc6CiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5yZWNvbW1lbmRfaW1hZ2UgPSBwYy5hdHRfZGlyOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGVbdGhpcy50YWJsZUluZGV4XS5waWMgPSBwYy5hdHRfZGlyOwogICAgICB9CgogICAgICB0aGlzLm1vZGFsUGljID0gZmFsc2U7CiAgICB9LAogICAgLy8g6I635Y+W5aSa5byg5Zu+5L+h5oGvCiAgICBnZXRQaWNEOiBmdW5jdGlvbiBnZXRQaWNEKHBjKSB7CiAgICAgIHZhciBfdGhpczE1ID0gdGhpczsKCiAgICAgIHRoaXMuaW1hZ2VzID0gcGM7CiAgICAgIHRoaXMuaW1hZ2VzLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgIF90aGlzMTUuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZS5wdXNoKGl0ZW0uYXR0X2Rpcik7CgogICAgICAgIF90aGlzMTUuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZSA9IF90aGlzMTUuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZS5zcGxpY2UoMCwgMTApOwogICAgICB9KTsKICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0ucGljID0gdGhpcy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlWzBdOwogICAgICB0aGlzLm1vZGFsUGljID0gZmFsc2U7CiAgICB9LAogICAgLy8g5o+Q5LqkCiAgICBoYW5kbGVTdWJtaXQ6IGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdChuYW1lKSB7CiAgICAgIHZhciBfdGhpczE2ID0gdGhpczsKCiAgICAgIHRoaXMuJHJlZnNbbmFtZV0udmFsaWRhdGUoZnVuY3Rpb24gKHZhbGlkKSB7CiAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICBfdGhpczE2LmZvcm1WYWxpZGF0ZS50eXBlID0gX3RoaXMxNi50eXBlOwoKICAgICAgICAgIGlmIChfdGhpczE2LmZvcm1WYWxpZGF0ZS5zcGVjX3R5cGUgPT09IDApIHsKICAgICAgICAgICAgX3RoaXMxNi5mb3JtVmFsaWRhdGUuYXR0cnMgPSBfdGhpczE2Lm9uZUZvcm1WYWxpZGF0ZTsKICAgICAgICAgICAgX3RoaXMxNi5mb3JtVmFsaWRhdGUuaGVhZGVyID0gW107CiAgICAgICAgICAgIF90aGlzMTYuZm9ybVZhbGlkYXRlLml0ZW1zID0gW107CiAgICAgICAgICAgIF90aGlzMTYuZm9ybVZhbGlkYXRlLmlzX2NvcHkgPSAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX3RoaXMxNi5mb3JtVmFsaWRhdGUuaXRlbXMgPSBfdGhpczE2LmF0dHJzOwogICAgICAgICAgICBfdGhpczE2LmZvcm1WYWxpZGF0ZS5hdHRycyA9IF90aGlzMTYubWFueUZvcm1WYWxpZGF0ZTsKICAgICAgICAgICAgX3RoaXMxNi5mb3JtVmFsaWRhdGUuaXNfY29weSA9IDE7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKF90aGlzMTYuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9PT0gMSAmJiBfdGhpczE2Lm1hbnlGb3JtVmFsaWRhdGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBfdGhpczE2LiRNZXNzYWdlLndhcm5pbmcoJ+WVhuWTgeS/oeaBry3or7fngrnlh7vnlJ/miJDlpJrop4TmoLwnKTsgLy8gcmV0dXJuIHRoaXMuJE1lc3NhZ2Uud2FybmluZygn6K+354K55Ye755Sf5oiQ6KeE5qC877yBJyk7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGl0ZW0gPSBfdGhpczE2LmZvcm1WYWxpZGF0ZS5hdHRyczsKCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGl0ZW1baV0uc3RvY2sgPiAxMDAwMDAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMTYuJE1lc3NhZ2UuZXJyb3IoJ+inhOagvOW6k+WtmC3lupPlrZjotoXlh7rns7vnu5/ojIPlm7QoMTAwMDAwMCknKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChfdGhpczE2LmZvcm1WYWxpZGF0ZS5pc19zdWJbMF0gPT09IDEpIHsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGl0ZW0ubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW1bX2ldLmJyb2tlcmFnZSA9PT0gbnVsbCB8fCBpdGVtW19pXS5icm9rZXJhZ2VfdHdvID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMxNi4kTWVzc2FnZS5lcnJvcign6JCl6ZSA6K6+572uLSDkuIDkuoznuqfov5TkvaPkuI3og73kuLrnqbonKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGl0ZW0ubGVuZ3RoOyBfaTIrKykgewogICAgICAgICAgICAgIGlmIChpdGVtW19pMl0udmlwX3ByaWNlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMxNi4kTWVzc2FnZS5lcnJvcign6JCl6ZSA6K6+572uLeS8muWRmOS7t+S4jeiDveS4uuepuicpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChfdGhpczE2LmZvcm1WYWxpZGF0ZS5pc19zdWIubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGl0ZW0ubGVuZ3RoOyBfaTMrKykgewogICAgICAgICAgICAgIGlmIChpdGVtW19pM10uYnJva2VyYWdlID09PSBudWxsIHx8IGl0ZW1bX2kzXS5icm9rZXJhZ2VfdHdvID09PSBudWxsIHx8IGl0ZW1bX2kzXS52aXBfcHJpY2UgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczE2LiRNZXNzYWdlLmVycm9yKCfokKXplIDorr7nva4tIOS4gOS6jOe6p+i/lOS9o+WSjOS8muWRmOS7t+S4jeiDveS4uuepuicpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChfdGhpczE2LmZvcm1WYWxpZGF0ZS5mcmVpZ2h0ID09IDMgJiYgIV90aGlzMTYuZm9ybVZhbGlkYXRlLnRlbXBfaWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzMTYuJE1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLei/kOi0ueaooeadv+S4jeiDveS4uuepuicpOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBhY3RpdmVJZHMgPSBbXTsKCiAgICAgICAgICBfdGhpczE2LmRhdGFMYWJlbC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgIGFjdGl2ZUlkcy5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgfSk7CgogICAgICAgICAgX3RoaXMxNi5mb3JtVmFsaWRhdGUubGFiZWxfaWQgPSBhY3RpdmVJZHM7CiAgICAgICAgICBfdGhpczE2Lm9wZW5TdWJpbWl0ID0gdHJ1ZTsKICAgICAgICAgIF90aGlzMTYuZm9ybVZhbGlkYXRlLmRlc2NyaXB0aW9uID0gX3RoaXMxNi5mb3JtYXRSaWNoVGV4dChfdGhpczE2LmNvbnRlbnQpOwogICAgICAgICAgcHJvZHVjdEFkZEFwaShfdGhpczE2LmZvcm1WYWxpZGF0ZSkudGhlbiggLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMihyZXMpIHsKICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0MikgewogICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgX3RoaXMxNi5vcGVuU3ViaW1pdCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgIF90aGlzMTYuJE1lc3NhZ2Uuc3VjY2VzcyhyZXMubXNnKTsKCiAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMxNi4kcm91dGUucGFyYW1zLmlkID09PSAnMCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVEZWxldGUoKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMxNi4kTWVzc2FnZS5lcnJvcihlcnIubXNnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzMTYub3BlblN1YmltaXQgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzMTYuJHJvdXRlci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnL2FkbWluL3Byb2R1Y3QvcHJvZHVjdF9saXN0JwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBfY2FsbGVlMik7CiAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gyKSB7CiAgICAgICAgICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9KCkpLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIF90aGlzMTYub3BlblN1YmltaXQgPSBmYWxzZTsKICAgICAgICAgICAgfSwgMTAwMCk7CgogICAgICAgICAgICBfdGhpczE2LiRNZXNzYWdlLmVycm9yKHJlcy5tc2cpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghX3RoaXMxNi5mb3JtVmFsaWRhdGUuc3RvcmVfbmFtZSkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMxNi4kTWVzc2FnZS53YXJuaW5nKCfllYblk4Hkv6Hmga8t5ZWG5ZOB5ZCN56ew5LiN6IO95Li656m6Jyk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczE2LmZvcm1WYWxpZGF0ZS5jYXRlX2lkLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMxNi4kTWVzc2FnZS53YXJuaW5nKCfllYblk4Hkv6Hmga8t5ZWG5ZOB5YiG57G75LiN6IO95Li656m6Jyk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczE2LmZvcm1WYWxpZGF0ZS51bml0X25hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzMTYuJE1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLeWVhuWTgeWNleS9jeS4jeiDveS4uuepuicpOwogICAgICAgICAgfSBlbHNlIGlmICghX3RoaXMxNi5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMxNi4kTWVzc2FnZS53YXJuaW5nKCfllYblk4Hkv6Hmga8t5ZWG5ZOB6L2u5pKt5Zu+5LiN6IO95Li656m6Jyk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczE2LmZvcm1WYWxpZGF0ZS5sb2dpc3RpY3MubGVuZ3RoICYmICFfdGhpczE2LmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzMTYuJE1lc3NhZ2Uud2FybmluZygn54mp5rWB6K6+572uLeiHs+WwkemAieaLqeS4gOenjeeJqea1geaWueW8jycpOwogICAgICAgICAgfSBlbHNlIGlmICghX3RoaXMxNi5mb3JtVmFsaWRhdGUudGVtcF9pZCAmJiBfdGhpczE2LmZvcm1WYWxpZGF0ZS5mcmVpZ2h0ID09IDMpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzMTYuJE1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLei/kOi0ueaooeadv+S4jeiDveS4uuepuicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgY2hhbmdlVGVtcGxhdGU6IGZ1bmN0aW9uIGNoYW5nZVRlbXBsYXRlKG1zZykgewogICAgICB0aGlzLnRlbXBsYXRlID0gbXNnOwogICAgfSwKICAgIC8vIOihqOWNlemqjOivgQogICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKHByb3AsIHN0YXR1cywgZXJyb3IpIHsKICAgICAgaWYgKHN0YXR1cyA9PT0gZmFsc2UpIHsKICAgICAgICB0aGlzLiRNZXNzYWdlLndhcm5pbmcoZXJyb3IpOwogICAgICB9CiAgICB9LAogICAgLy8g56e75YqoCiAgICBoYW5kbGVEcmFnU3RhcnQ6IGZ1bmN0aW9uIGhhbmRsZURyYWdTdGFydChlLCBpdGVtKSB7CiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBpdGVtOwogICAgfSwKICAgIGhhbmRsZURyYWdFbmQ6IGZ1bmN0aW9uIGhhbmRsZURyYWdFbmQoZSwgaXRlbSkgewogICAgICB0aGlzLmRyYWdnaW5nID0gbnVsbDsKICAgIH0sCiAgICBoYW5kbGVEcmFnT3ZlcjogZnVuY3Rpb24gaGFuZGxlRHJhZ092ZXIoZSkgewogICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnOwogICAgfSwKICAgIGhhbmRsZURyYWdFbnRlcjogZnVuY3Rpb24gaGFuZGxlRHJhZ0VudGVyKGUsIGl0ZW0pIHsKICAgICAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJzsKCiAgICAgIGlmIChpdGVtID09PSB0aGlzLmRyYWdnaW5nKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgbmV3SXRlbXMgPSBfdG9Db25zdW1hYmxlQXJyYXkodGhpcy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlKTsKCiAgICAgIHZhciBzcmMgPSBuZXdJdGVtcy5pbmRleE9mKHRoaXMuZHJhZ2dpbmcpOwogICAgICB2YXIgZHN0ID0gbmV3SXRlbXMuaW5kZXhPZihpdGVtKTsKICAgICAgbmV3SXRlbXMuc3BsaWNlLmFwcGx5KG5ld0l0ZW1zLCBbZHN0LCAwXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KG5ld0l0ZW1zLnNwbGljZShzcmMsIDEpKSkpOwogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5zbGlkZXJfaW1hZ2UgPSBuZXdJdGVtczsKICAgIH0sCiAgICAvLyDov4fmu6Tor6bmg4XlhoXlrrkKICAgIGZvcm1hdFJpY2hUZXh0OiBmdW5jdGlvbiBmb3JtYXRSaWNoVGV4dChodG1sKSB7CiAgICAgIHZhciBuZXdDb250ZW50ID0gaHRtbC5yZXBsYWNlKC88aW1nW14+XSo+L2dpLCBmdW5jdGlvbiAobWF0Y2gsIGNhcHR1cmUpIHsKICAgICAgICBtYXRjaCA9IG1hdGNoLnJlcGxhY2UoL3N0eWxlPSJbXiJdKyIvZ2ksICcnKS5yZXBsYWNlKC9zdHlsZT0nW14nXSsnL2dpLCAnJyk7CiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC93aWR0aD0iW14iXSsiL2dpLCAnJykucmVwbGFjZSgvd2lkdGg9J1teJ10rJy9naSwgJycpOwogICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvaGVpZ2h0PSJbXiJdKyIvZ2ksICcnKS5yZXBsYWNlKC9oZWlnaHQ9J1teJ10rJy9naSwgJycpOwogICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgfSk7CiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL3N0eWxlPSJbXiJdKyIvZ2ksIGZ1bmN0aW9uIChtYXRjaCwgY2FwdHVyZSkgewogICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvd2lkdGg6W147XSs7L2dpLCAnbWF4LXdpZHRoOjEwMCU7JykucmVwbGFjZSgvd2lkdGg6W147XSs7L2dpLCAnbWF4LXdpZHRoOjEwMCU7Jyk7CiAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICB9KTsKICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvPGJyW14+XSpcLz4vZ2ksICcnKTsKICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXDxpbWcvZ2ksICc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6MTAwJTtoZWlnaHQ6YXV0bztkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7IicpOwogICAgICByZXR1cm4gbmV3Q29udGVudDsKICAgIH0sCiAgICAvLyDllYblk4FpZAogICAgZ2V0UHJvZHVjdElkOiBmdW5jdGlvbiBnZXRQcm9kdWN0SWQocm93KSB7CiAgICAgIHRoaXMuZ29vZHNfbW9kYWxzID0gZmFsc2U7CiAgICAgIHZhciBhcnIgPSB0aGlzLmZvcm1WYWxpZGF0ZS5yZWNvbW1lbmRfbGlzdC5jb25jYXQocm93KTsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucmVjb21tZW5kX2xpc3QgPSB0aGlzLnVuaXF1ZXMoYXJyKTsKICAgIH0sCiAgICAvLyDpgInmi6nmjqjojZDllYblk4EKICAgIGNoYW5nZUdvb2RzOiBmdW5jdGlvbiBjaGFuZ2VHb29kcygpIHsKICAgICAgdGhpcy5nb29kc19tb2RhbHMgPSB0cnVlOwogICAgICB0aGlzLiRyZWZzLmdvb2RzbGlzdC5nZXRMaXN0KCk7CiAgICAgIHRoaXMuJHJlZnMuZ29vZHNsaXN0Lmdvb2RzQ2F0ZWdvcnkoKTsKICAgIH0sCiAgICAvLyDpgInmi6nnlKjmiLfmoIfnrb4KICAgIGFjdGl2ZURhdGE6IGZ1bmN0aW9uIGFjdGl2ZURhdGEoZGF0YUxhYmVsKSB7CiAgICAgIHRoaXMubGFiZWxTaG93ID0gZmFsc2U7CiAgICAgIHRoaXMuZGF0YUxhYmVsID0gZGF0YUxhYmVsOwogICAgfSwKICAgIC8vIOagh+etvuW8ueeql+WFs+mXrQogICAgbGFiZWxDbG9zZTogZnVuY3Rpb24gbGFiZWxDbG9zZSgpIHsKICAgICAgdGhpcy5sYWJlbFNob3cgPSBmYWxzZTsKICAgIH0sCiAgICAvLyDliKDpmaTnlKjmiLfmoIfnrb4KICAgIGNsb3NlTGFiZWw6IGZ1bmN0aW9uIGNsb3NlTGFiZWwobGFiZWwpIHsKICAgICAgdmFyIGluZGV4ID0gdGhpcy5kYXRhTGFiZWwuaW5kZXhPZih0aGlzLmRhdGFMYWJlbC5maWx0ZXIoZnVuY3Rpb24gKGQpIHsKICAgICAgICByZXR1cm4gZC5pZCA9PSBsYWJlbC5pZDsKICAgICAgfSlbMF0pOwogICAgICB0aGlzLmRhdGFMYWJlbC5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKICAgIC8vIOaJk+W8gOmAieaLqeeUqOaIt+agh+etvgogICAgb3BlbkxhYmVsOiBmdW5jdGlvbiBvcGVuTGFiZWwocm93KSB7CiAgICAgIHRoaXMubGFiZWxTaG93ID0gdHJ1ZTsKICAgICAgdGhpcy4kcmVmcy51c2VyTGFiZWwudXNlckxhYmVsKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhTGFiZWwpKSk7CiAgICB9LAogICAgdW5pcXVlczogZnVuY3Rpb24gdW5pcXVlcyhzb25ncykgewogICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgIHZhciBmaW5hbFJlc3VsdCA9IFtdOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb25ncy5sZW5ndGg7IGkrKykgewogICAgICAgIHJlc3VsdFtzb25nc1tpXS5wcm9kdWN0X2lkXSA9IHNvbmdzW2ldOwogICAgICB9CgogICAgICBmb3IgKHZhciBpdGVtIGluIHJlc3VsdCkgewogICAgICAgIGZpbmFsUmVzdWx0LnB1c2gocmVzdWx0W2l0ZW1dKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OwogICAgfSwKICAgIGhhbmRsZVJlbW92ZVJlY29tbWVuZDogZnVuY3Rpb24gaGFuZGxlUmVtb3ZlUmVjb21tZW5kKGkpIHsKICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucmVjb21tZW5kX2xpc3Quc3BsaWNlKGksIDEpOwogICAgfQogIH0KfTs="},{"version":3,"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;MACA;MACA;MACA;;MACA;QACA;MACA;;MACA;;MACA;QACA;MACA;;MACA;MACA,iBA3BA,CA4BA;;MACA;MACA;MACA;;MACA;QACA;MACA,CAFA,MAEA;QACA;QACA,wBACA;UACA1I,OADA;UAEAC,QAFA;UAGAC,OAHA;UAIAC,WAJA;UAKAC,QALA;UAMAC,YANA;UAOAC,SAPA;UAQAC,SARA;UASA8E,YATA;UAUAC,gBAVA;UAWAC,YAXA;UAYAC,gBAZA;UAaAC;QAbA,CADA;MAiBA;IACA,CAtNA;IAuNA;IACA6E,OAxNA,mBAwNAzM,IAxNA,EAwNA;MACA;MACA;IACA,CA3NA;IA6NA0M,SA7NA,qBA6NAC,GA7NA,EA6NA;MACA;IACA,CA/NA;IAgOAC,GAhOA,iBAgOA;MACA;IACA,CAlOA;IAmOA;IACAC,mBApOA,+BAoOA7M,IApOA,EAoOA;MACA;IACA,CAtOA;IAuOA8M,aAvOA,yBAuOA9M,IAvOA,EAuOA;MACA;QACA;UACA;QACA,CAFA,MAEA;UACA;QACA,CAFA,MAEA;UACA;QACA;;QACA;UACA;QACA;MACA,CAXA,MAWA;QACA;UACA;QACA,CAFA,MAEA;UACA;QACA,CAFA,MAEA;UACA;QACA;;QACA;UACA;QACA;MACA;IACA,CA/PA;IAgQA;IACA+M,SAjQA,uBAiQA;MACA;MACA;IACA,CApQA;IAqQA;IACAC,GAtQA,eAsQAhN,IAtQA,EAsQAX,IAtQA,EAsQAmM,KAtQA,EAsQA;MACA;MACA;;MAEA;QACA;UACA;UACA;UACA;QACA,CAJA,MAIA;UACA;UACA;QACA;;QACA;MACA,CAVA,MAUA;QACA;QACA;MACA;IACA,CAxRA;IAyRA;IACAyB,cA1RA,0BA0RAzB,KA1RA,EA0RAnM,IA1RA,EA0RA;MACA;MACA;MACA;MACA;IACA,CA/RA;IAgSA6N,UAhSA,sBAgSA1B,KAhSA,EAgSAnM,IAhSA,EAgSA;MACA;MACA;MACA;IACA,CApSA;IAqSA;IACA8N,SAtSA,uBAsSA;MACA;QACA;UACA;;UACA;YACA;YACA;UACA;QACA;;QACA;QACA;QACA,oBACA;UACA1L,OADA;UAEAC;QAFA,CADA;QAMA;MACA,CAjBA,MAiBA;QACA;UACA;QACA;;QACA;UACA;QACA;;QACA;QACA;QACA;QACA;MACA;;MACA;MACA;IACA,CAtUA;IAuUA;IACA0L,YAxUA,0BAwUA;MACA;MACA,oBACA;QACA3L,OADA;QAEAC;MAFA,CADA;MAMA;MACA;IACA,CAlVA;IAmVA;IACA2L,MApVA,kBAoVAC,GApVA,EAoVA;MACA;MACA;QAAA;MAAA;IACA,CAvVA;IAwVA;IACAC,MAzVA,kBAyVAjN,EAzVA,EAyVAkN,KAzVA,EAyVA;MACA;MACA;IACA,CA5VA;IA6VA;IACAC,aA9VA,yBA8VAzN,IA9VA,EA8VA;MACA;MACA;MACA;MACA;MACA;IACA,CApWA;IAqWA0N,WArWA,uBAqWArO,IArWA,EAqWA;MACA;MACA;MACA;MACAyK;MACA;MACA;IACA,CA5WA;IA6WA;IACA6D,OA9WA,qBA8WA;MACA;IACA,CAhXA;IAiXA;IACAC,OAlXA,qBAkXA;MACA;IACA,CApXA;IAqXA;IACAC,QAtXA,sBAsXA;MACA;MACAC;MACAA;MACAA;MACAA;IACA,CA5XA;IA6XAC,aA7XA,2BA6XA;MACA;QACA;MACA,CAFA,MAEA;QACA;MACA;IACA,CAnYA;IAoYA;IACAC,oBArYA,gCAqYAC,MArYA,EAqYA;MACA;MACA;;MACA;QACA;MACA;;MACAnP,wBACA8L,IADA,CACA;QACAsD;QACAJ,iBACAK,WADA,CACA;UACAjN,mBADA;UAEA+M,cAFA;UAGA1B,QAHA;UAIAjB,SAJA,qBAIAS,MAJA,EAIAzC,QAJA,EAIA;YACAwE;;YACA;cACAA;YACA;UACA;QATA,CADA,EAYAlD,IAZA,CAYA;UACAkD;UACAA;UACAA;QACA,CAhBA,EAiBAhD,KAjBA,CAiBA;UACAgD;QACA,CAnBA;MAoBA,CAvBA,EAwBAhD,KAxBA,CAwBA;QACAgD;MACA,CA1BA;IA2BA,CAtaA;IAuaA;IACAM,KAxaA,mBAwaA;MACA;IACA,CA1aA;IA2aA;IACAC,OA5aA,qBA4aA;MACA;IACA,CA9aA;IA+aA;IACAC,WAhbA,yBAgbA;MACA;IACA,CAlbA;IAmbA;IACAC,OApbA,qBAobA;MACA;IACA,CAtbA;IAubA;IACAC,cAxbA,4BAwbA;MACA;;MACA;QACA;UACA;QACA;MACA,CAJA,MAIA;QACA;UACA;QACA;MACA;;MACA;QACA;UACA;QACA;MACA;;MAfA,2CAgBAV,qBAhBA;MAAA;;MAAA;QAgBA;UAAA;UACA;UACA;UACA;QACA;MApBA;QAAA;MAAA;QAAA;MAAA;IAqBA,CA7cA;IA8cA;IACAW,aA/cA,2BA+cA;MACA;;MACA;QACA;MACA,CAFA,MAEA;QAAA,4CACAX,qBADA;QAAA;;QAAA;UACA;YAAA;YACA;UACA;QAHA;UAAA;QAAA;UAAA;QAAA;MAIA;IACA,CAxdA;IAydA;IACAY,SA1dA,uBA0dA;MACA;QACAjN,OADA;QAEAC;MAFA;IAIA,CA/dA;IAgeA;IACAiN,eAjeA,2BAieA5C,MAjeA,EAieA;MACA;QACA,oBACA;UACAtK,OADA;UAEAC;QAFA,CADA;MAMA;IACA,CA1eA;IA2eAkN,aA3eA,yBA2eApD,KA3eA,EA2eA;MACA;IACA,CA7eA;IA8eA;IACAqD,QA/eA,sBA+eA;MACA,qBACA;QACA1M,OADA;QAEAC,QAFA;QAGAC,OAHA;QAIAC,WAJA;QAKAC,QALA;QAMAC,YANA;QAOAC,SAPA;QAQAC;MARA,CADA;IAYA,CA5fA;IA6fAoM,OA7fA,qBA6fA;MACA;MACAhB;;MACA;QACA;MACA;;MACAA;QACA;UACAA;QACA;MACA,CAJA;IAKA,CAxgBA;IAygBA;IACAiB,cA1gBA,4BA0gBA;MAAA;;MACAnQ;QACA;MACA,CAFA;IAGA,CA9gBA;IA+gBA;IACAoQ,kBAhhBA,gCAghBA;MAAA;;MACAnQ;QACA;MACA,CAFA;IAGA,CAphBA;IAqhBA;IACAoQ,YAthBA,wBAshBAzD,KAthBA,EAshBA;MAAA;;MACA;;MACA;QACAzM,qBACA6L,IADA,CACA;UACA;;UACA;QACA,CAJA,EAKAE,KALA,CAKA;UACA;QACA,CAPA;MAQA,CATA,MASA;QACA;MACA;IACA,CApiBA;IAqiBA;IACAoE,QAtiBA,sBAsiBA;MAAA,4CACA,qBADA;MAAA;;MAAA;QACA;UAAA;;UACA;YACA;UACA;;UACA;YACA;UACA;;UACA;YACA;UACA;;UACA;YACA;UACA;;UACA;YACA;UACA;;UACA;YACA;UACA;;UACA;YACA;UACA;;UACA;YACA;UACA;QACA;MA1BA;QAAA;MAAA;QAAA;MAAA;IA2BA,CAjkBA;IAkkBA;IACAC,MAnkBA,oBAmkBA;MACA;MACA;MACA;IACA,CAvkBA;IAwkBA;IACAC,QAzkBA,oBAykBAlO,IAzkBA,EAykBA;MAAA;;MACAvC,gBACA;QACAgI,iBADA;QAEAH,mEAFA;QAGAF;MAHA,CADA,EAMA,oBANA,EAOApF,IAPA,EASA0J,IATA,CASA;QACA;QAAA,IACAyE,iDADA;;QAEA;UACA;QACA;;QACA;;QACA;UACA;UACA;QACA,CAHA,MAGA;UACA;UACA;QACA;;QACA;;QACA;UACA;YACAC;UACA,CAFA;;UAGA;QACA,CALA,MAKA;UACA;YACA;cACAA;YACA;UACA,CAJA;;UAKA;QACA;MACA,CArCA,EAsCAxE,KAtCA,CAsCA;QACA;MACA,CAxCA;IAyCA,CAnnBA;IAonBA;IACAyE,WArnBA,yBAqnBA;MACA;MACA;IACA,CAxnBA;IAynBAC,SAznBA,uBAynBA;MACA;MACA;IACA,CA5nBA;IA6nBA;IACAC,gBA9nBA,4BA8nBAjE,KA9nBA,EA8nBA;MACA;MACA;IACA,CAjoBA;IAkoBA;IACAkE,aAnoBA,yBAmoBAJ,IAnoBA,EAmoBA9D,KAnoBA,EAmoBA;MACA8D;IACA,CAroBA;IAsoBA;IACAK,cAvoBA,4BAuoBA;MACA;QACA;UACAjO,iCADA;UAEAkO;QAFA;QAIA;QACA;QACA;UACA;UACAC;UACA;QACA,CAJA,EAIA,EAJA;QAKA;QACA;QACA;MACA,CAfA,MAeA;QACA;MACA;IACA,CA1pBA;IA2pBA;IACAC,UA5pBA,sBA4pBAC,GA5pBA,EA4pBAC,GA5pBA,EA4pBA;MACA;QACA;QACA;QACA;UACA;UACAH;UACA;QACA,CAJA,EAIA,EAJA;MAKA,CARA,MAQA;QACA;MACA;IACA,CAxqBA;IAyqBA;IACAI,aA1qBA,2BA0qBA;MAAA;;MACAxR,eACAmM,IADA,CACA;QACA;MACA,CAHA,EAIAE,KAJA,CAIA;QACA;MACA,CANA;IAOA,CAlrBA;IAmrBA;IACAoF,WAprBA,uBAorBAvE,CAprBA,EAorBA;MACA;MACA;IACA,CAvrBA;IAwrBA;IACAwE,UAzrBA,wBAyrBA;MAAA;;MACA;MACA;;MACA;QACApR,qBACA6L,IADA,CACA,iBADA,EAEAE,KAFA,CAEA;UACA;;UACA;QACA,CALA;MAMA;IACA,CApsBA;IAqsBA;IACAsF,OAtsBA,qBAssBA;MAAA;;MACA;MACAtC;MACAtP,sCACAoM,IADA;QAAA,mEACA;UAAA;UAAA;YAAA;cAAA;gBAAA;kBACA5K,IADA,GACAuM,oBADA;;kBAEA;;kBACA;;gBAHA;gBAAA;kBAAA;cAAA;YAAA;UAAA;QAAA,CADA;;QAAA;UAAA;QAAA;MAAA,KAMAzB,KANA,CAMA;QACA;;QACA;MACA,CATA;IAUA,CAntBA;IAotBA;IACAuF,UArtBA,sBAqtBAhR,IArtBA,EAqtBA;MACA;IACA,CAvtBA;IAwtBAiR,YAxtBA,wBAwtBAC,CAxtBA,EAwtBA;MACA;MACA;MACA;IACA,CA5tBA;IA6tBA;IACAC,YA9tBA,wBA8tBAC,GA9tBA,EA8tBA;MACA;IACA,CAhuBA;IAiuBA;IACAC,WAluBA,uBAkuBAtQ,GAluBA,EAkuBAoI,MAluBA,EAkuBAgD,KAluBA,EAkuBA;MACA;MACA;MACA;MACA;IACA,CAvuBA;IAwuBA;IACAmF,MAzuBA,kBAyuBAC,EAzuBA,EAyuBA;MACA;QACA;UACA;;UACA;YACA;cACA;YACA,CAFA,MAEA;cACA;gBACAtB;cACA,CAFA;cAGA;YACA;UACA;;UACA;;QACA;UACA;UACA;;QACA;UACA;UACA;;QACA;UACA;UACA;;QACA;UACA;MAxBA;;MA0BA;IACA,CArwBA;IAswBA;IACAuB,OAvwBA,mBAuwBAD,EAvwBA,EAuwBA;MAAA;;MACA;MACA;QACA;;QACA;MACA,CAHA;MAIA;MACA;IACA,CA/wBA;IAgxBA;IACAE,YAjxBA,wBAixBAzR,IAjxBA,EAixBA;MAAA;;MACA;QACA;UACA;;UACA;YACA;YACA;YACA;YACA;UACA,CALA,MAKA;YACA;YACA;YACA;UACA;;UACA;YACA,iDADA,CAEA;UACA;;UACA;;UACA;YACA;cACA;YACA;UACA;;UACA;YACA;cACA;gBACA;cACA;YACA;UACA,CANA,MAMA;YACA;cACA;gBACA;cACA;YACA;UACA;;UACA;YACA;cACA;gBACA;cACA;YACA;UACA;;UACA;YACA;UACA;;UACA;;UACA;YACA0R;UACA,CAFA;;UAGA;UACA;UACA;UACArS,oCACAkM,IADA;YAAA,oEACA;cAAA;gBAAA;kBAAA;oBAAA;sBACA;;sBACA;;sBACA;wBACA3L;0BACA;wBACA,CAFA;sBAGA;;sBACA+R;wBACA;;wBACA;0BAAA5E;wBAAA;sBACA,CAHA,EAGA,GAHA;;oBARA;oBAAA;sBAAA;kBAAA;gBAAA;cAAA;YAAA,CADA;;YAAA;cAAA;YAAA;UAAA,KAcAtB,KAdA,CAcA;YACAkG;cACA;YACA,CAFA,EAEA,IAFA;;YAGA;UACA,CAnBA;QAoBA,CAxEA,MAwEA;UACA;YACA;UACA,CAFA,MAEA;YACA;UACA,CAFA,MAEA;YACA;UACA,CAFA,MAEA;YACA;UACA,CAFA,MAEA;YACA;UACA,CAFA,MAEA;YACA;UACA;QACA;MACA,CAxFA;IAyFA,CA32BA;IA42BAC,cA52BA,0BA42BAR,GA52BA,EA42BA;MACA;IACA,CA92BA;IA+2BA;IACAS,QAh3BA,oBAg3BAC,IAh3BA,EAg3BApF,MAh3BA,EAg3BAV,KAh3BA,EAg3BA;MACA;QACA;MACA;IACA,CAp3BA;IAq3BA;IACA+F,eAt3BA,2BAs3BAzF,CAt3BA,EAs3BA2D,IAt3BA,EAs3BA;MACA;IACA,CAx3BA;IAy3BA+B,aAz3BA,yBAy3BA1F,CAz3BA,EAy3BA2D,IAz3BA,EAy3BA;MACA;IACA,CA33BA;IA43BAgC,cA53BA,0BA43BA3F,CA53BA,EA43BA;MACAA;IACA,CA93BA;IA+3BA4F,eA/3BA,2BA+3BA5F,CA/3BA,EA+3BA2D,IA/3BA,EA+3BA;MACA3D;;MACA;QACA;MACA;;MACA;;MACA;MACA;MACA6F;MACA;IACA,CAz4BA;IA04BA;IACAC,cA34BA,0BA24BAC,IA34BA,EA24BA;MACA;QACAC;QACAA;QACAA;QACA;MACA,CALA;MAMAC;QACAD;QACA;MACA,CAHA;MAIAC;MACAA,gCACA,SADA,EAEA,qFAFA;MAIA;IACA,CA55BA;IA65BA;IACAC,YA95BA,wBA85BAC,GA95BA,EA85BA;MACA;MACA;MACA;IACA,CAl6BA;IAm6BA;IACAC,WAp6BA,yBAo6BA;MACA;MACA;MACA;IACA,CAx6BA;IAy6BA;IACAC,UA16BA,sBA06BA9R,SA16BA,EA06BA;MACA;MACA;IACA,CA76BA;IA86BA;IACA+R,UA/6BA,wBA+6BA;MACA;IACA,CAj7BA;IAk7BA;IACAC,UAn7BA,sBAm7BAlO,KAn7BA,EAm7BA;MACA;QAAA;MAAA;MACA;IACA,CAt7BA;IAu7BA;IACAmO,SAx7BA,qBAw7BAL,GAx7BA,EAw7BA;MACA;MACA;IACA,CA37BA;IA47BAM,OA57BA,mBA47BAC,KA57BA,EA47BA;MACA;MACA;;MACA;QACAC;MACA;;MACA;QACAC;MACA;;MACA;IACA,CAt8BA;IAu8BAC,qBAv8BA,iCAu8BAjC,CAv8BA,EAu8BA;MACA;IACA;EAz8BA;AArjBA","names":["productInfoApi","treeListApi","productAddApi","generateAttrApi","productGetRuleApi","productGetTemplateApi","productGetTempKeysApi","checkActivityApi","productCache","cacheDelete","uploadType","importCard","productCreateApi","name","components","uploadPictures","freightTemplate","addAttr","couponList","taoBao","draggable","goodsList","WangEditor","userLabel","data","labelShow","dataLabel","headTab","tit","virtual","id","tit2","seletVideo","customBtn","content","contents","fileUrl","fileUrl2","cardUrl","upload_type","uploadData","header","type","modals","goods_modals","spinShow","openSubimit","virtualData","virtualList","key","value","grid2","xl","lg","md","sm","xs","grid3","oneFormBatch","pic","price","cost","ot_price","stock","bar_code","weight","volume","formDynamic","attrsName","attrsVal","disk_type","tabIndex","tabName","formDynamicNameData","isBtn","columns2","title","slot","align","minWidth","fixed","columns3","columns","columnsInstall","columnsInstal2","gridPic","gridBtn","CustomList","label","customess","formValidate","disk_info","logistics","freight","postage","recommend","presale_day","presale","is_limit","limit_type","limit_num","video_open","vip_product","custom_form","store_name","cate_id","label_id","keyword","unit_name","store_info","image","recommend_image","slider_image","description","ficti","give_integral","sort","is_show","is_hot","is_benefit","is_best","is_new","is_good","is_postage","is_sub","recommend_list","virtual_type","spec_type","is_virtual","video_link","temp_id","attrs","items","activity","couponName","selectRule","coupon_ids","command_word","ruleList","templateList","createBnt","showIput","manyFormValidate","oneFormValidate","brokerage","brokerage_two","vip_price","virtual_list","coupon_id","images","imagesTable","currentTab","isChoice","grid","loading","modalPic","addVirtualModel","template","uploadList","treeSelect","picTit","tableIndex","ruleValidate","required","message","trigger","min","presale_time","max","manyBrokerage","manyBrokerageTwo","manyVipPrice","upload","videoIng","progress","videoLink","默认","秒杀","砍价","拼团","updateIds","updateName","couponIds","couponNames","rakeBack","width","member","columnsInstalM","moveIndex","computed","mapState","labelWidth","labelPosition","labelBottom","created","mounted","then","ids","catch","methods","videoSaveToUrl","file","uploadByPieces","pieceSize","success","error","uploading","virtualbtn","index","addCate","logisticsBtn","e","addLabel","customMessBtn","addcustom","status","delcustom","onchangeTime","getEditorContent","cancel","path","getToken","upFile","res","infoData","onClose","checkMove","evt","end","checkAllGroupChange","checkAllGroup","addCoupon","see","addGoodsCoupon","addVirtual","upVirtual","closeVirtual","unique","arr","nameId","names","goodsCouponId","handleClose","getList","addTemp","delVideo","that","zh_uploadFile","zh_uploadFile_change","evfile","console","videoUpload","upTab","downTab","userSearchs","addRule","brokerageSetUp","vipPriceSetUp","handleAdd","initVirtualData","removeVirtual","batchDel","confirm","productGetRule","productGetTemplate","delAttrTable","batchAdd","addBtn","generate","header1","item","offAttrName","clearAttr","handleRemoveRole","handleRemove2","createAttrName","detail","hash","createAttr","num","idx","goodsCategory","changeVideo","changeSpec","getInfo","onhangeTab","handleRemove","i","changeCancel","msg","modalPicTap","getPic","pc","getPicD","handleSubmit","activeIds","setTimeout","changeTemplate","validate","prop","handleDragStart","handleDragEnd","handleDragOver","handleDragEnter","newItems","formatRichText","html","match","newContent","getProductId","row","changeGoods","activeData","labelClose","closeLabel","openLabel","uniques","songs","result","finalResult","handleRemoveRecommend"],"sourceRoot":"src/pages/product/productAdd","sources":["index.vue"],"sourcesContent":["<template>\r\n <div class=\"\" id=\"shopp-manager\">\r\n <div class=\"i-layout-page-header header_top\">\r\n <div class=\"i-layout-page-header fl_header\">\r\n <router-link :to=\"{ path: '/admin/product/product_list' }\"\r\n ><Button icon=\"ios-arrow-back\" size=\"small\" type=\"text\">返回</Button></router-link\r\n >\r\n <Divider type=\"vertical\" />\r\n <span\r\n class=\"ivu-page-header-title mr20\"\r\n style=\"padding: 0\"\r\n v-text=\"$route.params.id ? '编辑商品' : '添加商品'\"\r\n ></span>\r\n </div>\r\n </div>\r\n <Card :bordered=\"false\" dis-hover class=\"ivu-mt\">\r\n <Tabs v-model=\"currentTab\" @on-click=\"onhangeTab\">\r\n <TabPane v-for=\"(item, index) in headTab\" :key=\"index\" :label=\"item.tit\" :name=\"item.name\"></TabPane>\r\n </Tabs>\r\n <Form\r\n class=\"formValidate mt20\"\r\n ref=\"formValidate\"\r\n :rules=\"ruleValidate\"\r\n :model=\"formValidate\"\r\n :label-width=\"labelWidth\"\r\n :label-position=\"labelPosition\"\r\n @submit.native.prevent\r\n >\r\n <!-- 基础信息-->\r\n <Row :gutter=\"24\" type=\"flex\" v-show=\"currentTab === '1'\">\r\n <Col span=\"24\">\r\n <FormItem label=\"商品类型:\" props=\"is_virtual\">\r\n <div\r\n class=\"virtual\"\r\n :class=\"formValidate.virtual_type == item.id ? 'virtual_boder' : 'virtual_boder2'\"\r\n v-for=\"(item, index) in virtual\"\r\n :key=\"index\"\r\n @click=\"virtualbtn(item.id, 2)\"\r\n >\r\n <div class=\"virtual_top\">{{ item.tit }}</div>\r\n <div class=\"virtual_bottom\">({{ item.tit2 }})</div>\r\n <div v-if=\"formValidate.virtual_type == item.id\" class=\"virtual_san\"></div>\r\n <div v-if=\"formValidate.virtual_type == item.id\" class=\"virtual_dui\">✓</div>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"商品分类:\" prop=\"cate_id\">\r\n <Select v-model=\"formValidate.cate_id\" placeholder=\"请选择商品分类\" multiple class=\"perW20\">\r\n <Option v-for=\"item in treeSelect\" :disabled=\"item.pid === 0\" :value=\"item.id\" :key=\"item.id\">{{\r\n item.html + item.cate_name\r\n }}</Option>\r\n </Select>\r\n <span class=\"addfont\" @click=\"addCate\">新增分类</span>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"商品名称:\" prop=\"store_name\">\r\n <Input class=\"perW20\" v-model.trim=\"formValidate.store_name\" placeholder=\"请输入商品名称\" />\r\n </FormItem>\r\n </Col>\r\n\r\n <Col span=\"24\">\r\n <FormItem label=\"单位:\" prop=\"unit_name\">\r\n <Input class=\"perW20\" v-model=\"formValidate.unit_name\" placeholder=\"请输入单位\" />\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"商品轮播图:\" prop=\"slider_image\">\r\n <div class=\"acea-row\">\r\n <div\r\n class=\"pictrue\"\r\n v-for=\"(item, index) in formValidate.slider_image\"\r\n :key=\"index\"\r\n draggable=\"true\"\r\n @dragstart=\"handleDragStart($event, item)\"\r\n @dragover.prevent=\"handleDragOver($event, item)\"\r\n @dragenter=\"handleDragEnter($event, item)\"\r\n @dragend=\"handleDragEnd($event, item)\"\r\n >\r\n <img v-lazy=\"item\" />\r\n <Button shape=\"circle\" icon=\"md-close\" @click.native=\"handleRemove(index)\" class=\"btndel\"></Button>\r\n </div>\r\n <div\r\n v-if=\"formValidate.slider_image.length < 10\"\r\n class=\"upLoad acea-row row-center-wrapper\"\r\n @click=\"modalPicTap('duo')\"\r\n >\r\n <Icon type=\"ios-camera-outline\" size=\"26\" />\r\n </div>\r\n <Input v-model=\"formValidate.slider_image[0]\" style=\"display: none\"></Input>\r\n </div>\r\n\r\n <div class=\"titTip\">建议尺寸:800*800,可拖拽改变图片顺序,默认首张图为主图,最多上传10张</div>\r\n\r\n <!-- <div class=\"tips\">(最多10张<br />750*750)</div> -->\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"添加视频:\">\r\n <i-switch v-model=\"formValidate.video_open\" size=\"large\">\r\n <span slot=\"open\">开启</span>\r\n <span slot=\"close\">关闭</span>\r\n </i-switch>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.video_open\">\r\n <FormItem label=\"视频类型:\">\r\n <RadioGroup v-model=\"seletVideo\" @on-change=\"changeVideo\">\r\n <Radio :label=\"0\" class=\"radio\">本地视频</Radio>\r\n <Radio :label=\"1\">视频链接</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.video_open\" id=\"selectvideo\">\r\n <FormItem label=\"\" prop=\"video_link\">\r\n <Input\r\n v-if=\"seletVideo == 1 && !formValidate.video_link\"\r\n class=\"perW20\"\r\n v-model=\"videoLink\"\r\n placeholder=\"请输入视频链接\"\r\n />\r\n <input type=\"file\" ref=\"refid\" @change=\"zh_uploadFile_change\" style=\"display: none\" />\r\n <div\r\n v-if=\"seletVideo == 0 && (upload_type !== '1' || videoLink) && !formValidate.video_link\"\r\n class=\"ml10 videbox\"\r\n @click=\"zh_uploadFile\"\r\n >\r\n +\r\n </div>\r\n <Button\r\n v-if=\"seletVideo == 1 && (upload_type !== '1' || videoLink) && !formValidate.video_link\"\r\n type=\"primary\"\r\n icon=\"ios-cloud-upload-outline\"\r\n class=\"ml10\"\r\n @click=\"zh_uploadFile\"\r\n >确认添加</Button\r\n >\r\n <Upload\r\n v-if=\"upload_type === '1' && !videoLink\"\r\n :show-upload-list=\"false\"\r\n :action=\"fileUrl2\"\r\n :before-upload=\"videoSaveToUrl\"\r\n :data=\"uploadData\"\r\n :headers=\"header\"\r\n :multiple=\"true\"\r\n style=\"display: inline-block\"\r\n >\r\n <div v-if=\"seletVideo === 0 && !formValidate.video_link\" class=\"videbox\">+</div>\r\n </Upload>\r\n <div class=\"iview-video-style\" v-if=\"formValidate.video_link\">\r\n <video\r\n style=\"width: 100%; height: 100% !important; border-radius: 10px\"\r\n :src=\"formValidate.video_link\"\r\n controls=\"controls\"\r\n >\r\n 您的浏览器不支持 video 标签。\r\n </video>\r\n <div class=\"mark\"></div>\r\n <Icon type=\"ios-trash-outline\" class=\"iconv\" @click=\"delVideo\" />\r\n </div>\r\n <Progress class=\"progress\" :percent=\"progress\" :stroke-width=\"5\" v-if=\"upload.videoIng || videoIng\" />\r\n <div class=\"titTip\">建议时长:9~30秒,视频宽高比16:9</div>\r\n </FormItem>\r\n </Col>\r\n <Col v-bind=\"grid\">\r\n <FormItem label=\"商品状态:\">\r\n <RadioGroup v-model=\"formValidate.is_show\">\r\n <Radio :label=\"1\" class=\"radio\">上架</Radio>\r\n <Radio :label=\"0\">下架</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n\r\n <!-- <Col span=\"24\">\r\n <FormItem label=\"商品标签:\" prop=\"label_id\">\r\n <Select v-model=\"formValidate.label_id\" multiple v-width=\"'50%'\">\r\n <Option v-for=\"item in dataLabel\" :value=\"item.id\" :key=\"item.id\">{{ item.label_name }}</Option>\r\n </Select>\r\n </FormItem>\r\n </Col> -->\r\n </Row>\r\n <!-- 规格库存-->\r\n <Row :gutter=\"24\" type=\"flex\" v-show=\"currentTab === '2'\">\r\n <Col span=\"24\">\r\n <FormItem label=\"商品规格:\" props=\"spec_type\">\r\n <RadioGroup v-model=\"formValidate.spec_type\" @on-change=\"changeSpec\">\r\n <Radio :label=\"0\" class=\"radio\">单规格</Radio>\r\n <Radio :label=\"1\">多规格</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n <!-- 多规格添加-->\r\n <Col span=\"24\" v-if=\"formValidate.spec_type === 1\" class=\"noForm\">\r\n <Col span=\"24\">\r\n <FormItem label=\"选择规格:\" prop=\"\">\r\n <div class=\"acea-row row-middle\">\r\n <Select v-model=\"formValidate.selectRule\" class=\"perW20\">\r\n <Option v-for=\"(item, index) in ruleList\" :value=\"item.rule_name\" :key=\"index\">{{\r\n item.rule_name\r\n }}</Option>\r\n </Select>\r\n <Button type=\"primary\" class=\"mr20\" @click=\"confirm\">确认</Button>\r\n <Button @click=\"addRule\">添加规格模板</Button>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem v-if=\"attrs.length !== 0\">\r\n <draggable\r\n class=\"dragArea list-group\"\r\n :list=\"attrs\"\r\n group=\"peoples\"\r\n handle=\".move-icon\"\r\n :move=\"checkMove\"\r\n @end=\"end\"\r\n >\r\n <div v-for=\"(item, index) in attrs\" :key=\"index\" class=\"acea-row row-middle mb10\">\r\n <div class=\"move-icon\">\r\n <span class=\"iconfont icondrag2\"></span>\r\n </div>\r\n <div style=\"width: 90%\" :class=\"moveIndex === index ? 'borderStyle' : ''\">\r\n <div class=\"acea-row row-middle\">\r\n <span class=\"mr5\">{{ item.value }}</span\r\n ><Icon type=\"ios-close-circle\" size=\"14\" class=\"curs\" @click=\"handleRemoveRole(index)\" />\r\n </div>\r\n <div class=\"rulesBox\">\r\n <draggable :list=\"item.detail\" handle=\".drag\">\r\n <Tag\r\n type=\"dot\"\r\n closable\r\n color=\"primary\"\r\n v-for=\"(j, indexn) in item.detail\"\r\n :key=\"indexn\"\r\n :name=\"j\"\r\n class=\"mr20 drag\"\r\n @on-close=\"handleRemove2(item.detail, indexn)\"\r\n >{{ j }}</Tag\r\n >\r\n </draggable>\r\n <Input\r\n search\r\n enter-button=\"添加\"\r\n placeholder=\"请输入属性名称\"\r\n v-model=\"item.detail.attrsVal\"\r\n @on-search=\"createAttr(item.detail.attrsVal, index)\"\r\n style=\"width: 150px\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </draggable>\r\n <!-- <div v-for=\"(item, index) in attrs\" :key=\"index\">\r\n <div class=\"acea-row row-middle\"><span class=\"mr5\">{{item.value}}</span><Icon type=\"ios-close-circle\" size=\"14\" class=\"curs\" @click=\"handleRemoveRole(index)\"/></div>\r\n <div class=\"rulesBox\">\r\n <Tag type=\"dot\" closable color=\"primary\" v-for=\"(j, indexn) in item.detail\" :key=\"indexn\" :name=\"j\" class=\"mr20\" @on-close=\"handleRemove2(item.detail,indexn)\">{{j}}</Tag>\r\n <Input search enter-button=\"添加\" placeholder=\"请输入属性名称\" v-model=\"item.detail.attrsVal\" @on-search=\"createAttr(item.detail.attrsVal,index)\" style=\"width: 150px\"/>\r\n </div>\r\n </div> -->\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"createBnt\">\r\n <FormItem>\r\n <Button type=\"primary\" icon=\"md-add\" @click=\"addBtn\" class=\"mr15\">添加新规格</Button>\r\n <Button type=\"success\" @click=\"generate(1)\">立即生成</Button>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"showIput\">\r\n <Col :xl=\"6\" :lg=\"9\" :md=\"10\" :sm=\"24\" :xs=\"24\">\r\n <FormItem label=\"规格:\">\r\n <Input placeholder=\"请输入规格\" v-model=\"formDynamic.attrsName\" />\r\n </FormItem>\r\n </Col>\r\n <Col :xl=\"6\" :lg=\"9\" :md=\"10\" :sm=\"24\" :xs=\"24\">\r\n <FormItem label=\"规格值:\">\r\n <Input v-model=\"formDynamic.attrsVal\" placeholder=\"请输入规格值\" />\r\n </FormItem>\r\n </Col>\r\n <Col :xl=\"6\" :lg=\"5\" :md=\"10\" :sm=\"24\" :xs=\"24\">\r\n <FormItem>\r\n <Button type=\"primary\" class=\"mr15\" @click=\"createAttrName\">确定</Button>\r\n <Button @click=\"offAttrName\">取消</Button>\r\n </FormItem>\r\n </Col>\r\n </Col>\r\n <!-- 多规格设置-->\r\n <Col\r\n :xl=\"24\"\r\n :lg=\"24\"\r\n :md=\"24\"\r\n :sm=\"24\"\r\n :xs=\"24\"\r\n v-if=\"manyFormValidate.length && formValidate.header.length !== 0 && attrs.length !== 0\"\r\n >\r\n <!-- 批量设置-->\r\n\r\n <Col span=\"24\" v-if=\"!formValidate.is_virtual\">\r\n <FormItem label=\"批量设置:\" class=\"labeltop\">\r\n <Table :data=\"oneFormBatch\" :columns=\"formValidate.is_virtual ? columns3 : columns2\" border>\r\n <template slot-scope=\"{ row, index }\" slot=\"pic\">\r\n <div class=\"acea-row row-middle row-center-wrapper\" @click=\"modalPicTap('dan', 'duopi', index)\">\r\n <div class=\"pictrue pictrueTab\" v-if=\"oneFormBatch[0].pic\">\r\n <img v-lazy=\"oneFormBatch[0].pic\" />\r\n </div>\r\n <div class=\"upLoad pictrueTab acea-row row-center-wrapper\" v-else>\r\n <Icon type=\"ios-camera-outline\" size=\"21\" class=\"iconfont\" />\r\n </div>\r\n </div>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"price\">\r\n <InputNumber\r\n v-model=\"oneFormBatch[0].price\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"cost\">\r\n <InputNumber\r\n v-model=\"oneFormBatch[0].cost\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"ot_price\">\r\n <InputNumber v-model=\"oneFormBatch[0].ot_price\" :min=\"0\" class=\"priceBox\"></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"stock\">\r\n <InputNumber\r\n v-model=\"oneFormBatch[0].stock\"\r\n :disabled=\"formValidate.is_virtual == 1 && formValidate.virtual_type == 1\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"fictitious\">\r\n <Button\r\n v-if=\"!row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"addGoodsCoupon(index, 'oneFormBatch')\"\r\n >添加优惠券</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"see(row, 'manyFormValidate', index)\"\r\n >{{ row.coupon_name }}</span\r\n >\r\n <Button\r\n v-else-if=\"!row.virtual_list.length && formValidate.virtual_type == 1\"\r\n @click=\"addVirtual(index, 'oneFormBatch')\"\r\n >添加卡密</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"row.virtual_list.length && formValidate.virtual_type == 1\"\r\n @click=\"see(row, 'oneFormBatch', index)\"\r\n >已设置</span\r\n >\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"bar_code\">\r\n <Input v-model=\"oneFormBatch[0].bar_code\"></Input>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"weight\">\r\n <InputNumber\r\n v-model=\"oneFormBatch[0].weight\"\r\n :step=\"0.1\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"volume\">\r\n <InputNumber\r\n v-model=\"oneFormBatch[0].volume\"\r\n :step=\"0.1\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"action\">\r\n <a @click=\"batchAdd\">批量添加</a>\r\n <Divider type=\"vertical\" />\r\n <a @click=\"batchDel\">清空</a>\r\n </template>\r\n </Table>\r\n </FormItem>\r\n </Col>\r\n <!-- 多规格表格-->\r\n <Col span=\"24\">\r\n <FormItem label=\"商品属性:\" class=\"labeltop\">\r\n <Table :data=\"manyFormValidate\" :columns=\"formValidate.header\" border>\r\n <template slot-scope=\"{ row, index }\" slot=\"pic\">\r\n <div\r\n class=\"acea-row row-middle row-center-wrapper\"\r\n @click=\"modalPicTap('dan', 'duoTable', index)\"\r\n >\r\n <div class=\"pictrue pictrueTab\" v-if=\"manyFormValidate[index].pic\">\r\n <img v-lazy=\"manyFormValidate[index].pic\" />\r\n </div>\r\n <div class=\"upLoad pictrueTab acea-row row-center-wrapper\" v-else>\r\n <Icon type=\"ios-camera-outline\" size=\"21\" class=\"iconfont\" />\r\n </div>\r\n </div>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"price\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].price\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"cost\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].cost\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"ot_price\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].ot_price\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"stock\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].stock\"\r\n :disabled=\"formValidate.is_virtual == 1 && formValidate.virtual_type == 1\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n :precision=\"0\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"bar_code\">\r\n <Input v-model=\"manyFormValidate[index].bar_code\"></Input>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"weight\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].weight\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"volume\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].volume\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"fictitious\">\r\n <Button\r\n v-if=\"!row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"addGoodsCoupon(index, 'manyFormValidate')\"\r\n >添加优惠券</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"see(row, 'manyFormValidate', index)\"\r\n >{{ row.coupon_name }}</span\r\n >\r\n <Button\r\n v-else-if=\"!row.virtual_list && !row.stock && formValidate.virtual_type == 1\"\r\n @click=\"addVirtual(index, 'manyFormValidate')\"\r\n >添加卡密</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"(row.virtual_list.length || row.stock) && formValidate.virtual_type == 1\"\r\n @click=\"see(row, 'manyFormValidate', index)\"\r\n >已设置</span\r\n >\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"action\">\r\n <a @click=\"delAttrTable(index)\">删除</a>\r\n </template>\r\n </Table>\r\n </FormItem>\r\n </Col>\r\n </Col>\r\n </Col>\r\n <!-- 单规格表格-->\r\n <div v-if=\"formValidate.spec_type === 0\">\r\n <Col span=\"24\">\r\n <FormItem label=\"图片:\">\r\n <div class=\"pictrueBox\" @click=\"modalPicTap('dan', 'danTable', 0)\">\r\n <div class=\"pictrue\" v-if=\"oneFormValidate[0].pic\">\r\n <img v-lazy=\"oneFormValidate[0].pic\" />\r\n <Input v-model=\"oneFormValidate[0].pic\" style=\"display: none\"></Input>\r\n </div>\r\n <div class=\"upLoad acea-row row-center-wrapper\" v-else>\r\n <Input v-model=\"oneFormValidate[0].pic\" style=\"display: none\"></Input>\r\n <Icon type=\"ios-camera-outline\" size=\"26\" />\r\n </div>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"售价:\">\r\n <InputNumber\r\n v-model=\"oneFormValidate[0].price\"\r\n :min=\"0\"\r\n :precision=\"2\"\r\n :max=\"99999999\"\r\n class=\"perW20\"\r\n :active-change=\"false\"\r\n ></InputNumber>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"成本价:\">\r\n <InputNumber\r\n v-model=\"oneFormValidate[0].cost\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n :precision=\"2\"\r\n :active-change=\"false\"\r\n class=\"perW20\"\r\n ></InputNumber>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"原价:\">\r\n <InputNumber\r\n v-model=\"oneFormValidate[0].ot_price\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n :precision=\"2\"\r\n :active-change=\"false\"\r\n class=\"perW20\"\r\n ></InputNumber>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"库存:\">\r\n <InputNumber\r\n v-model=\"oneFormValidate[0].stock\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n :disabled=\"formValidate.virtual_type == 1\"\r\n :precision=\"0\"\r\n class=\"perW20\"\r\n ></InputNumber>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"商品编号:\">\r\n <Input v-model.trim=\"oneFormValidate[0].bar_code\" class=\"perW20\"></Input>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.virtual_type == 0\">\r\n <FormItem label=\"重量(KG):\">\r\n <InputNumber v-model=\"oneFormValidate[0].weight\" :min=\"0\" :max=\"99999999\" class=\"perW20\"></InputNumber>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"体积(m³):\" v-if=\"formValidate.virtual_type == 0\">\r\n <InputNumber v-model=\"oneFormValidate[0].volume\" :min=\"0\" :max=\"99999999\" class=\"perW20\"></InputNumber>\r\n </FormItem>\r\n </Col>\r\n\r\n <Col span=\"24\">\r\n <FormItem label=\"虚拟商品:\" v-if=\"formValidate.virtual_type == 1 || formValidate.virtual_type == 2\">\r\n <Button\r\n v-if=\"!oneFormValidate[0].coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"addGoodsCoupon(0, 'oneFormValidate')\"\r\n >添加优惠券</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"oneFormValidate[0].coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"see(oneFormValidate[0], 'oneFormValidate', 0)\"\r\n >{{ oneFormValidate[0].coupon_name }}</span\r\n >\r\n <Button\r\n v-if=\"\r\n !oneFormValidate[0].virtual_list.length &&\r\n !oneFormValidate[0].stock &&\r\n formValidate.virtual_type == 1\r\n \"\r\n @click=\"addVirtual(0, 'oneFormValidate')\"\r\n >添加卡密</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"\r\n (oneFormValidate[0].virtual_list.length || oneFormValidate[0].stock > 0) &&\r\n formValidate.virtual_type == 1\r\n \"\r\n @click=\"see(oneFormValidate[0], 'oneFormValidate', 0)\"\r\n >已设置</span\r\n >\r\n </FormItem>\r\n </Col>\r\n </div>\r\n </Row>\r\n <!-- 商品详情-->\r\n <Row v-show=\"currentTab === '3'\">\r\n <Col span=\"16\">\r\n <FormItem label=\"商品详情:\">\r\n <WangEditor style=\"width: 100%\" :content=\"contents\" @editorContent=\"getEditorContent\"></WangEditor>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"6\" style=\"width: 33%\">\r\n <div class=\"ifam\">\r\n <div class=\"content\" v-html=\"content\"></div>\r\n </div>\r\n </Col>\r\n </Row>\r\n\r\n <!-- 物流设置-->\r\n <Row v-show=\"headTab.length === 6 ? currentTab === '4' : false\">\r\n <Col span=\"24\">\r\n <FormItem label=\"物流方式:\" prop=\"logistics\">\r\n <CheckboxGroup v-model=\"formValidate.logistics\" @on-change=\"logisticsBtn\">\r\n <Checkbox label=\"1\">快递</Checkbox>\r\n\r\n <Checkbox label=\"2\">到店核销</Checkbox>\r\n </CheckboxGroup>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"运费设置:\">\r\n <RadioGroup v-model=\"formValidate.freight\">\r\n <!-- <Radio :label=\"1\">包邮</Radio> -->\r\n <Radio :label=\"2\">固定邮费</Radio>\r\n <Radio :label=\"3\">运费模板</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.freight != 3 && formValidate.freight != 1\">\r\n <FormItem label=\"\" :prop=\"formValidate.freight != 1 ? 'freight' : ''\">\r\n <div class=\"acea-row\">\r\n <InputNumber :min=\"0\" v-model=\"formValidate.postage\" placeholder=\"请输入金额\" class=\"perW20 maxW\" />\r\n </div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.freight == 3\">\r\n <FormItem label=\"\" prop=\"temp_id\">\r\n <div class=\"acea-row\">\r\n <Select v-model=\"formValidate.temp_id\" clearable placeholder=\"请选择运费模板\" class=\"perW20 maxW\">\r\n <Option v-for=\"(item, index) in templateList\" :value=\"item.id\" :key=\"index\">{{ item.name }}</Option>\r\n </Select>\r\n <span class=\"addfont\" @click=\"addTemp\">新增运费模板</span>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n </Row>\r\n <!-- 营销设置-->\r\n <Row :gutter=\"24\" type=\"flex\" v-show=\"headTab.length === 6 ? currentTab === '5' : currentTab === '4'\">\r\n <Col span=\"24\">\r\n <FormItem label=\"虚拟销量:\">\r\n <InputNumber :min=\"0\" :max=\"999999\" v-model=\"formValidate.ficti\" placeholder=\"请输入虚拟销量\" />\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"排序:\">\r\n <InputNumber :min=\"0\" :max=\"999999\" v-model=\"formValidate.sort\" placeholder=\"请输入排序\" />\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <div class=\"line\"></div>\r\n </Col>\r\n\r\n <Col span=\"24\">\r\n <FormItem label=\"购买送积分:\" prop=\"give_integral\">\r\n <InputNumber v-model=\"formValidate.give_integral\" :min=\"0\" :max=\"999999\" placeholder=\"请输入积分\" />\r\n </FormItem>\r\n </Col>\r\n <Col v-bind=\"grid3\">\r\n <FormItem label=\"购买送优惠券:\">\r\n <div v-if=\"couponName.length\" class=\"mb20\">\r\n <Tag closable v-for=\"(item, index) in couponName\" :key=\"index\" @on-close=\"handleClose(item)\">{{\r\n item.title\r\n }}</Tag>\r\n </div>\r\n <Button type=\"primary\" @click=\"addCoupon\">添加优惠券</Button>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"关联用户标签:\" prop=\"label_id\">\r\n <div style=\"display: flex\">\r\n <div class=\"labelInput acea-row row-between-wrapper\" @click=\"openLabel\">\r\n <div style=\"width: 90%\">\r\n <div v-if=\"dataLabel.length\">\r\n <Tag closable v-for=\"(item, index) in dataLabel\" @on-close=\"closeLabel(item)\" :key=\"index\">{{\r\n item.label_name\r\n }}</Tag>\r\n </div>\r\n <span class=\"span\" v-else>选择用户关联标签</span>\r\n </div>\r\n <div class=\"iconfont iconxiayi\"></div>\r\n </div>\r\n <span class=\"addfont\" @click=\"addLabel\">新增标签</span>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <div class=\"line\"></div>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"付费会员专属:\">\r\n <i-switch v-model=\"formValidate.vip_product\" size=\"large\">\r\n <span slot=\"open\">开启</span>\r\n <span slot=\"close\">关闭</span>\r\n </i-switch>\r\n <div class=\"titTip\">开启后仅付费会员可以看见并购买此商品</div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"单独设置:\">\r\n <CheckboxGroup v-model=\"formValidate.is_sub\" @on-change=\"checkAllGroupChange\">\r\n <Checkbox :label=\"1\">佣金设置(数字即返佣金额)</Checkbox>\r\n <Checkbox :label=\"0\">付费会员价</Checkbox>\r\n </CheckboxGroup>\r\n <!-- <RadioGroup v-model=\"formValidate.is_sub\">\r\n <Radio :label=\"1\" class=\"radio\">佣金设置</Radio>\r\n <Radio :label=\"0\">会员价</Radio>\r\n </RadioGroup> -->\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.is_sub.length\">\r\n <!--单规格返佣-->\r\n <FormItem label=\"商品属性:\" v-if=\"formValidate.spec_type === 0\">\r\n <Table :data=\"oneFormValidate\" :columns=\"columnsInstall\" border>\r\n <template slot-scope=\"{ row, index }\" slot=\"pic\">\r\n <div class=\"pictrue pictrueTab\">\r\n <img v-lazy=\"oneFormValidate[0].pic\" />\r\n </div>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"price\">{{ oneFormValidate[0].price }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"cost\">{{ oneFormValidate[0].cost }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"ot_price\">{{ oneFormValidate[0].ot_price }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"stock\">{{ oneFormValidate[0].stock }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"bar_code\">{{ oneFormValidate[0].bar_code }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"weight\">{{ oneFormValidate[0].weight }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"fictitious\">\r\n <Button\r\n v-if=\"!row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"addGoodsCoupon(index, 'oneFormValidate')\"\r\n >添加优惠券</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"see(row, 'manyFormValidate', index)\"\r\n >{{ row.coupon_name }}</span\r\n >\r\n <Button\r\n v-else-if=\"!row.virtual_list.length && !row.stock && formValidate.virtual_type == 1\"\r\n @click=\"addVirtual(index, 'oneFormValidate')\"\r\n >添加卡密</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"(row.virtual_list.length || row.stock) && formValidate.virtual_type == 1\"\r\n @click=\"see(row, 'oneFormValidate', index)\"\r\n >已设置</span\r\n >\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"volume\">{{ oneFormValidate[0].volume }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"brokerage\">\r\n <InputNumber\r\n v-model=\"oneFormValidate[0].brokerage\"\r\n :min=\"0\"\r\n :max=\"999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row }\" slot=\"brokerage_two\">\r\n <InputNumber\r\n v-model=\"oneFormValidate[0].brokerage_two\"\r\n :min=\"0\"\r\n :max=\"999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row }\" slot=\"vip_price\">\r\n <InputNumber\r\n v-model=\"oneFormValidate[0].vip_price\"\r\n :min=\"0\"\r\n :max=\"999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n </Table>\r\n <!-- <Table v-else :data=\"oneFormValidate\" :columns=\"columnsInsta8\" border>\r\n <template slot-scope=\"{ row, index }\" slot=\"pic\">\r\n <div class=\"pictrue pictrueTab\"><img v-lazy=\"oneFormValidate[0].pic\"></div>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"price\">{{oneFormValidate[0].price}}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"cost\">{{oneFormValidate[0].cost}}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"ot_price\">{{oneFormValidate[0].ot_price}}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"vip_price\">\r\n <InputNumber v-model=\"oneFormValidate[0].vip_price\" :min=\"0\" :precision=\"0\" class=\"priceBox\"></InputNumber>\r\n </template>\r\n </Table> -->\r\n </FormItem>\r\n <!--多规格返佣-->\r\n <FormItem label=\"批量设置:\" v-if=\"formValidate.spec_type === 1\">\r\n <span v-if=\"formValidate.is_sub.indexOf(1) > -1\">\r\n 一级返佣:<InputNumber\r\n placeholder=\"请输入一级返佣\"\r\n :min=\"0\"\r\n :max=\"9999999\"\r\n class=\"columnsBox perW20\"\r\n v-model=\"manyBrokerage\"\r\n ></InputNumber>\r\n 二级返佣:<InputNumber\r\n placeholder=\"请输入二级返佣\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"columnsBox perW20\"\r\n v-model=\"manyBrokerageTwo\"\r\n ></InputNumber>\r\n </span>\r\n <span v-if=\"formValidate.is_sub.indexOf(0) > -1\">\r\n 会员价:<InputNumber\r\n placeholder=\"请输入会员价\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"columnsBox perW20\"\r\n v-model=\"manyVipPrice\"\r\n ></InputNumber>\r\n </span>\r\n <Button type=\"primary\" @click=\"brokerageSetUp\">批量设置</Button>\r\n <!-- <template v-if=\"formValidate.is_sub\">\r\n <InputNumber v-width=\"'20%'\" placeholder=\"请输入一级返佣\" :min=\"0\" class=\"columnsBox\" v-model=\"manyBrokerage\"></InputNumber>\r\n <InputNumber v-width=\"'20%'\" placeholder=\"请输入二级返佣\" :min=\"0\" class=\"columnsBox\" v-model=\"manyBrokerageTwo\"></InputNumber>\r\n <Button type=\"primary\" @click=\"brokerageSetUp\">批量设置</Button>\r\n </template>\r\n <template v-else>\r\n <InputNumber v-width=\"'20%'\" placeholder=\"请输入会员价\" :min=\"0\" class=\"columnsBox\" v-model=\"manyVipPrice\"></InputNumber>\r\n <Button type=\"primary\" @click=\"vipPriceSetUp\">批量设置</Button>\r\n </template> -->\r\n </FormItem>\r\n <FormItem label=\"商品属性:\" v-if=\"formValidate.spec_type === 1 && manyFormValidate.length\">\r\n <Table v-if=\"formValidate.is_sub\" :data=\"manyFormValidate\" :columns=\"columnsInstal2\" border>\r\n <template slot-scope=\"{ row, index }\" slot=\"pic\">\r\n <div class=\"pictrue pictrueTab\">\r\n <img v-lazy=\"manyFormValidate[index].pic\" />\r\n </div>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"price\">{{ manyFormValidate[index].price }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"cost\">{{ manyFormValidate[index].cost }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"ot_price\">{{ manyFormValidate[index].ot_price }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"stock\">{{ manyFormValidate[index].stock }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"bar_code\">{{ manyFormValidate[index].bar_code }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"weight\">{{ manyFormValidate[index].weight }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"fictitious\">\r\n <Button\r\n v-if=\"!row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"addGoodsCoupon(index, 'manyFormValidate')\"\r\n >添加优惠券</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"row.coupon_id && formValidate.virtual_type == 2\"\r\n @click=\"see(row, 'manyFormValidate', index)\"\r\n >{{ row.coupon_name }}</span\r\n >\r\n <Button\r\n v-else-if=\"!row.virtual_list.length && !row.stock && formValidate.virtual_type == 1\"\r\n @click=\"addVirtual(index, 'manyFormValidate')\"\r\n >添加卡密</Button\r\n >\r\n <span\r\n class=\"see\"\r\n v-else-if=\"(row.virtual_list.length || row.stock) && formValidate.virtual_type == 1\"\r\n @click=\"see(row, 'manyFormValidate', index)\"\r\n >已设置</span\r\n >\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"volume\">{{ manyFormValidate[index].volume }}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"brokerage\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].brokerage\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"brokerage_two\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].brokerage_two\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"vip_price\">\r\n <InputNumber\r\n v-model=\"manyFormValidate[index].vip_price\"\r\n :min=\"0\"\r\n :max=\"99999999\"\r\n class=\"priceBox\"\r\n ></InputNumber>\r\n </template>\r\n </Table>\r\n <!-- <Table v-else :data=\"manyFormValidate\" :columns=\"columnsInsta9\" border>\r\n <template slot-scope=\"{ row, index }\" slot=\"pic\">\r\n <div class=\"pictrue pictrueTab\"><img v-lazy=\"manyFormValidate[index].pic\"></div>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"price\">{{manyFormValidate[index].price}}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"cost\">{{manyFormValidate[index].cost}}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"ot_price\">{{manyFormValidate[index].ot_price}}</template>\r\n <template slot-scope=\"{ row, index }\" slot=\"vip_price\">\r\n <InputNumber v-model=\"manyFormValidate[index].vip_price\" :min=\"0\" class=\"priceBox\"></InputNumber>\r\n </template>\r\n </Table> -->\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <div class=\"line\"></div>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"是否限购:\">\r\n <i-switch v-model=\"formValidate.is_limit\" size=\"large\">\r\n <span slot=\"open\">开启</span>\r\n <span slot=\"close\">关闭</span>\r\n </i-switch>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"限购类型:\" v-if=\"formValidate.is_limit\">\r\n <RadioGroup v-model=\"formValidate.limit_type\">\r\n <Radio :label=\"1\">单次限购</Radio>\r\n <Radio :label=\"2\">永久限购</Radio>\r\n </RadioGroup>\r\n <div class=\"titTip\">单次限购是限制每次下单最多购买的数量,永久限购是限制一个用户总共可以购买的数量</div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.is_limit\">\r\n <FormItem label=\"限购数量:\" prop=\"limit_num\">\r\n <div class=\"acea-row row-middle\">\r\n <span class=\"mr10\"></span>\r\n <InputNumber placeholder=\"请输入限购数量\" :precision=\"0\" :min=\"1\" v-model=\"formValidate.limit_num\" />\r\n <span class=\"ml10\"> 件 </span>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.virtual_type == 0 || formValidate.virtual_type == 3\">\r\n <FormItem label=\"预售商品:\">\r\n <i-switch v-model=\"formValidate.presale\" size=\"large\">\r\n <span slot=\"open\">开启</span>\r\n <span slot=\"close\">关闭</span>\r\n </i-switch>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.presale\">\r\n <FormItem label=\"预售活动时间:\" prop=\"presale_time\">\r\n <div class=\"acea-row row-middle\">\r\n <DatePicker\r\n :editable=\"false\"\r\n type=\"datetimerange\"\r\n format=\"yyyy-MM-dd HH:mm\"\r\n placeholder=\"请选择活动时间\"\r\n @on-change=\"onchangeTime\"\r\n :value=\"formValidate.presale_time\"\r\n v-model=\"formValidate.presale_time\"\r\n ></DatePicker>\r\n </div>\r\n <div class=\"titTip\">设置活动开启结束时间,用户可以在设置时间内发起参与预售</div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\" v-if=\"formValidate.presale\">\r\n <FormItem label=\"发货时间:\" prop=\"presale_day\">\r\n <div class=\"acea-row row-middle\">\r\n <span class=\"mr10\">预售活动结束后</span>\r\n <InputNumber placeholder=\"请输入发货时间\" :precision=\"0\" :min=\"1\" v-model=\"formValidate.presale_day\" />\r\n <span class=\"ml10\"> 天之内 </span>\r\n <div class=\"ml10 grey\"></div>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n\r\n <Col span=\"24\">\r\n <FormItem label=\"商品推荐:\">\r\n <CheckboxGroup v-model=\"formValidate.recommend\">\r\n <Checkbox label=\"is_hot\">热卖单品</Checkbox>\r\n <Checkbox label=\"is_benefit\">促销单品</Checkbox>\r\n <Checkbox label=\"is_best\">精品推荐</Checkbox>\r\n <Checkbox label=\"is_new\">首发新品</Checkbox>\r\n <Checkbox label=\"is_good\">优品推荐</Checkbox>\r\n </CheckboxGroup>\r\n </FormItem>\r\n </Col>\r\n <!-- <Col v-bind=\"grid\">\r\n <FormItem label=\"热卖单品:\">\r\n <RadioGroup v-model=\"formValidate.is_hot\">\r\n <Radio :label=\"1\" class=\"radio\">开启</Radio>\r\n <Radio :label=\"0\">关闭</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n <Col v-bind=\"grid\">\r\n <FormItem label=\"促销单品:\">\r\n <RadioGroup v-model=\"formValidate.is_benefit\">\r\n <Radio :label=\"1\" class=\"radio\">开启</Radio>\r\n <Radio :label=\"0\">关闭</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n <Col v-bind=\"grid\">\r\n <FormItem label=\"精品推荐:\">\r\n <RadioGroup v-model=\"formValidate.is_best\">\r\n <Radio :label=\"1\" class=\"radio\">开启</Radio>\r\n <Radio :label=\"0\">关闭</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n <Col v-bind=\"grid\">\r\n <FormItem label=\"首发新品:\">\r\n <RadioGroup v-model=\"formValidate.is_new\">\r\n <Radio :label=\"1\" class=\"radio\">开启</Radio>\r\n <Radio :label=\"0\">关闭</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col>\r\n <Col v-bind=\"grid\">\r\n <FormItem label=\"优品推荐:\">\r\n <RadioGroup v-model=\"formValidate.is_good\">\r\n <Radio :label=\"1\" class=\"radio\">开启</Radio>\r\n <Radio :label=\"0\">关闭</Radio>\r\n </RadioGroup>\r\n </FormItem>\r\n </Col> -->\r\n <Col v-bind=\"grid3\">\r\n <FormItem label=\"活动优先级:\">\r\n <div class=\"color-list acea-row row-middle\">\r\n <div\r\n class=\"color-item\"\r\n :class=\"activity[color]\"\r\n v-for=\"color in formValidate.activity\"\r\n v-dragging=\"{\r\n item: color,\r\n list: formValidate.activity,\r\n group: 'color',\r\n }\"\r\n :key=\"color\"\r\n >\r\n {{ color }}\r\n </div>\r\n </div>\r\n <div class=\"titTip\">可拖动按钮调整活动的优先展示顺序</div>\r\n </FormItem>\r\n </Col>\r\n <Col v-bind=\"grid3\">\r\n <FormItem label=\"选择优品推荐商品:\">\r\n <div class=\"picBox\">\r\n <div class=\"pictrue\" v-for=\"(item, index) in formValidate.recommend_list\" :key=\"index\">\r\n <img v-lazy=\"item.image\" />\r\n <Button\r\n shape=\"circle\"\r\n icon=\"md-close\"\r\n @click.native=\"handleRemoveRecommend(index)\"\r\n class=\"btndel\"\r\n ></Button>\r\n </div>\r\n <div class=\"upLoad acea-row row-center-wrapper\" @click=\"changeGoods\">\r\n <Icon type=\"ios-add\" size=\"26\" class=\"iconfonts\" />\r\n </div>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n </Row>\r\n <!-- 其他设置-->\r\n <Row\r\n type=\"flex\"\r\n justify=\"space-between\"\r\n v-show=\"headTab.length === 6 ? currentTab === '6' : currentTab === '5'\"\r\n >\r\n <Col span=\"24\">\r\n <FormItem label=\"商品关键字:\">\r\n <Input class=\"perW20\" v-model.trim=\"formValidate.keyword\" placeholder=\"请输入商品关键字\" />\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"商品简介:\">\r\n <Input\r\n class=\"perW20\"\r\n v-model.trim=\"formValidate.store_info\"\r\n type=\"textarea\"\r\n :rows=\"3\"\r\n placeholder=\"请输入商品简介\"\r\n />\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"商品口令:\">\r\n <Input\r\n v-model.trim=\"formValidate.command_word\"\r\n placeholder=\"请输入商品口令\"\r\n type=\"textarea\"\r\n :rows=\"3\"\r\n class=\"perW20\"\r\n />\r\n </FormItem>\r\n </Col>\r\n\r\n <Col span=\"24\">\r\n <FormItem label=\"商品推荐图:\">\r\n <div class=\"pictrueBox\" @click=\"modalPicTap('dan', 'recommend_image')\">\r\n <div class=\"pictrue\" v-if=\"formValidate.recommend_image\">\r\n <img v-lazy=\"formValidate.recommend_image\" />\r\n <Input v-model.trim=\"formValidate.recommend_image\" style=\"display: none\"></Input>\r\n </div>\r\n <div class=\"upLoad acea-row row-center-wrapper\" v-else>\r\n <Input v-model.trim=\"formValidate.recommend_image\" style=\"display: none\"></Input>\r\n <Icon type=\"ios-camera-outline\" size=\"26\" />\r\n </div>\r\n <div class=\"titTip\">建议比例:5:2</div>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n <Col span=\"24\">\r\n <FormItem label=\"自定义留言:\">\r\n <i-switch v-model=\"customBtn\" @on-change=\"customMessBtn\" size=\"large\">\r\n <span slot=\"open\">开启</span>\r\n <span slot=\"close\">关闭</span>\r\n </i-switch>\r\n <div class=\"addCustom_content\" v-if=\"customBtn\">\r\n <div v-for=\"(item, index) in formValidate.custom_form\" type=\"flex\" :key=\"index\" class=\"custom_box\">\r\n <Input\r\n v-model.trim=\"item.title\"\r\n :placeholder=\"'留言标题' + (index + 1)\"\r\n style=\"width: 150px; margin-right: 10px\"\r\n :maxlength=\"10\"\r\n />\r\n <Select v-model=\"item.label\" style=\"width: 200px; margin-left: 6px; margin-right: 10px\">\r\n <Option v-for=\"items in CustomList\" :value=\"items.value\" :key=\"items.value\">{{\r\n items.label\r\n }}</Option>\r\n </Select>\r\n <Checkbox v-model=\"item.status\">必填</Checkbox>\r\n <div class=\"addfont\" @click=\"delcustom(index)\">删除</div>\r\n </div>\r\n </div>\r\n <div class=\"addCustomBox\" v-show=\"customBtn\">\r\n <div class=\"btn\" @click=\"addcustom\">+ 添加表单</div>\r\n <div class=\"titTip\">用户下单时需填写的信息,最多可设置10条</div>\r\n </div>\r\n </FormItem>\r\n </Col>\r\n </Row>\r\n <FormItem>\r\n <Button v-if=\"currentTab !== '1'\" @click=\"upTab\">上一步</Button>\r\n <Button\r\n type=\"primary\"\r\n class=\"submission\"\r\n v-if=\"currentTab !== '6' && formValidate.virtual_type == 0\"\r\n @click=\"downTab\"\r\n >下一步</Button\r\n >\r\n <Button\r\n type=\"primary\"\r\n class=\"submission\"\r\n v-if=\"currentTab !== '5' && formValidate.virtual_type != 0\"\r\n @click=\"downTab\"\r\n >下一步</Button\r\n >\r\n <Button\r\n type=\"primary\"\r\n :disabled=\"openSubimit\"\r\n class=\"submission\"\r\n @click=\"handleSubmit('formValidate')\"\r\n v-if=\"($route.params.id || currentTab === '6') && formValidate.virtual_type == 0\"\r\n >保存</Button\r\n >\r\n <Button\r\n type=\"primary\"\r\n :disabled=\"openSubimit\"\r\n class=\"submission\"\r\n @click=\"handleSubmit('formValidate')\"\r\n v-if=\"($route.params.id || currentTab === '5') && formValidate.virtual_type != 0\"\r\n >保存</Button\r\n >\r\n </FormItem>\r\n <Spin size=\"large\" fix v-if=\"spinShow\"></Spin>\r\n </Form>\r\n <Modal\r\n v-model=\"modalPic\"\r\n width=\"1024px\"\r\n scrollable\r\n footer-hide\r\n closable\r\n title=\"上传商品图\"\r\n :mask-closable=\"false\"\r\n :z-index=\"1\"\r\n >\r\n <uploadPictures\r\n :isChoice=\"isChoice\"\r\n @getPic=\"getPic\"\r\n @getPicD=\"getPicD\"\r\n :gridBtn=\"gridBtn\"\r\n :gridPic=\"gridPic\"\r\n v-if=\"modalPic\"\r\n ></uploadPictures>\r\n </Modal>\r\n <Modal\r\n v-model=\"addVirtualModel\"\r\n width=\"700px\"\r\n closable\r\n title=\"添加卡密\"\r\n :mask-closable=\"false\"\r\n :z-index=\"1\"\r\n footer-hide\r\n @on-visible-change=\"initVirtualData\"\r\n >\r\n <div class=\"trip\"></div>\r\n <div class=\"type-radio\">\r\n <Form :label-width=\"80\">\r\n <FormItem label=\"卡密类型:\">\r\n <RadioGroup v-model=\"disk_type\" size=\"large\">\r\n <Radio :label=\"1\">固定卡密</Radio>\r\n <Radio :label=\"2\">一次性卡密</Radio>\r\n </RadioGroup>\r\n <div v-if=\"disk_type == 1\">\r\n <div class=\"stock-disk\">\r\n <Input v-model=\"disk_info\" size=\"large\" type=\"textarea\" :rows=\"4\" placeholder=\"填写卡密信息\" />\r\n </div>\r\n <div class=\"stock-input\">\r\n <Input type=\"number\" v-model=\"stock\" size=\"large\" placeholder=\"填写库存数量\">\r\n <span slot=\"append\">件</span>\r\n </Input>\r\n </div>\r\n </div>\r\n <div class=\"scroll-virtual\" v-if=\"disk_type == 2\">\r\n <div class=\"virtual-data mb10\" v-for=\"(item, index) in virtualList\" :key=\"index\">\r\n <span class=\"mr10 virtual-title\">卡号{{ index + 1 }}:</span>\r\n <Input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.key\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡号(非必填)\"\r\n ></Input>\r\n <span class=\"mr10 virtual-title\">卡密{{ index + 1 }}:</span>\r\n <Input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.value\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡密\"\r\n ></Input>\r\n <span class=\"deteal-btn\" @click=\"removeVirtual(index)\">删除</span>\r\n </div>\r\n </div>\r\n <div class=\"add-more\" v-if=\"disk_type == 2\">\r\n <Button type=\"primary\" @click=\"handleAdd\" icon=\"md-add\">新增</Button>\r\n <Upload class=\"ml10\" :action=\"cardUrl\" :data=\"uploadData\" :headers=\"header\" :on-success=\"upFile\">\r\n <Button icon=\"ios-cloud-upload-outline\">导入卡密</Button>\r\n </Upload>\r\n </div>\r\n </FormItem>\r\n </Form>\r\n </div>\r\n <div class=\"footer\">\r\n <div class=\"clear\" @click=\"closeVirtual\">取消</div>\r\n <div class=\"submit\" @click=\"upVirtual\">确认</div>\r\n </div>\r\n </Modal>\r\n </Card>\r\n <freightTemplate :template=\"template\" v-on:changeTemplate=\"changeTemplate\" ref=\"templates\"></freightTemplate>\r\n <add-attr ref=\"addattr\" @getList=\"userSearchs\"></add-attr>\r\n <coupon-list\r\n ref=\"couponTemplates\"\r\n @nameId=\"nameId\"\r\n :couponids=\"formValidate.coupon_ids\"\r\n :updateIds=\"updateIds\"\r\n :updateName=\"updateName\"\r\n ></coupon-list>\r\n <coupon-list ref=\"goodsCoupon\" many=\"one\" :luckDraw=\"true\" @getCouponId=\"goodsCouponId\"></coupon-list>\r\n <!-- 生成淘宝京东表单-->\r\n <Modal\r\n v-model=\"modals\"\r\n @on-cancel=\"cancel\"\r\n class=\"Box\"\r\n scrollable\r\n footer-hide\r\n closable\r\n title=\"复制淘宝、天猫、京东、苏宁、1688\"\r\n :mask-closable=\"false\"\r\n width=\"800\"\r\n height=\"500\"\r\n >\r\n <tao-bao ref=\"taobaos\" v-if=\"modals\" @on-close=\"onClose\"></tao-bao>\r\n </Modal>\r\n <Modal v-model=\"goods_modals\" title=\"商品列表\" footerHide class=\"paymentFooter\" scrollable width=\"900\">\r\n <goods-list v-if=\"goods_modals\" ref=\"goodslist\" :ischeckbox=\"true\" @getProductId=\"getProductId\"></goods-list>\r\n </Modal>\r\n <!-- 用户标签 -->\r\n <Modal\r\n v-model=\"labelShow\"\r\n scrollable\r\n title=\"请选择用户标签\"\r\n :closable=\"false\"\r\n width=\"500\"\r\n :footer-hide=\"true\"\r\n :mask-closable=\"false\"\r\n >\r\n <userLabel ref=\"userLabel\" @activeData=\"activeData\" @close=\"labelClose\"></userLabel>\r\n </Modal>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport userLabel from '@/components/labelList';\r\nimport { mapState } from 'vuex';\r\nimport vuedraggable from 'vuedraggable';\r\nimport uploadPictures from '@/components/uploadPictures';\r\nimport freightTemplate from '@/components/freightTemplate';\r\nimport couponList from '@/components/couponList';\r\nimport addAttr from '../productAttr/addAttr';\r\nimport goodsList from '@/components/goodsList/index';\r\nimport taoBao from './taoBao';\r\nimport WangEditor from '@/components/wangEditor/index.vue';\r\nimport { userLabelAddApi } from '@/api/user';\r\nimport {\r\n productInfoApi,\r\n treeListApi,\r\n productAddApi,\r\n generateAttrApi,\r\n productGetRuleApi,\r\n productGetTemplateApi,\r\n productGetTempKeysApi,\r\n checkActivityApi,\r\n productCache,\r\n cacheDelete,\r\n uploadType,\r\n importCard,\r\n productCreateApi,\r\n} from '@/api/product';\r\nimport Setting from '@/setting';\r\nimport { getCookies } from '@/libs/util';\r\nimport { uploadByPieces } from '@/utils/upload'; //引入uploadByPieces方法\r\n\r\nexport default {\r\n name: 'product_productAdd',\r\n components: {\r\n // VueUeditorWrap,\r\n uploadPictures,\r\n freightTemplate,\r\n addAttr,\r\n couponList,\r\n taoBao,\r\n draggable: vuedraggable,\r\n goodsList,\r\n WangEditor,\r\n userLabel,\r\n },\r\n data() {\r\n return {\r\n labelShow: false,\r\n dataLabel: [],\r\n headTab: [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '营销设置', name: '5' },\r\n { tit: '其他设置', name: '6' },\r\n ],\r\n virtual: [\r\n { tit: '普通商品', id: 0, tit2: '物流发货' },\r\n { tit: '卡密/网盘', id: 1, tit2: '自动发货' },\r\n { tit: '优惠券', id: 2, tit2: '自动发货' },\r\n { tit: '虚拟商品', id: 3, tit2: '虚拟发货' },\r\n ],\r\n seletVideo: 0, //选择视频类型\r\n customBtn: false, //自定义留言开关\r\n content: '',\r\n contents: '',\r\n fileUrl: Setting.apiBaseURL + '/file/upload',\r\n fileUrl2: Setting.apiBaseURL + '/file/video_upload',\r\n cardUrl: Setting.apiBaseURL + '/file/upload/1',\r\n upload_type: '', //视频上传类型 1 本地上传 2 3 4 OSS上传\r\n uploadData: {}, // 上传参数\r\n header: {},\r\n\r\n type: 0,\r\n modals: false,\r\n goods_modals: false,\r\n spinShow: false,\r\n openSubimit: false,\r\n virtualData: '',\r\n virtualList: [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ],\r\n grid2: {\r\n xl: 10,\r\n lg: 12,\r\n md: 12,\r\n sm: 24,\r\n xs: 24,\r\n },\r\n grid3: {\r\n xl: 18,\r\n lg: 18,\r\n md: 20,\r\n sm: 24,\r\n xs: 24,\r\n },\r\n // 批量设置表格data\r\n oneFormBatch: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n weight: 0,\r\n volume: 0,\r\n },\r\n ],\r\n // 规格数据\r\n formDynamic: {\r\n attrsName: '',\r\n attrsVal: '',\r\n },\r\n disk_type: 1, //卡密类型\r\n tabIndex: 0,\r\n tabName: '',\r\n formDynamicNameData: [],\r\n isBtn: false,\r\n columns2: [\r\n {\r\n title: '图片',\r\n slot: 'pic',\r\n align: 'center',\r\n minWidth: 80,\r\n },\r\n {\r\n title: '售价',\r\n slot: 'price',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '成本价',\r\n slot: 'cost',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '原价',\r\n slot: 'ot_price',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '库存',\r\n slot: 'stock',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '商品编号',\r\n slot: 'bar_code',\r\n align: 'center',\r\n minWidth: 120,\r\n },\r\n {\r\n title: '重量(KG)',\r\n slot: 'weight',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '体积(m³)',\r\n slot: 'volume',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '操作',\r\n slot: 'action',\r\n fixed: 'right',\r\n align: 'center',\r\n minWidth: 140,\r\n },\r\n ],\r\n columns3: [\r\n {\r\n title: '图片',\r\n slot: 'pic',\r\n align: 'center',\r\n minWidth: 80,\r\n },\r\n {\r\n title: '售价',\r\n slot: 'price',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '成本价',\r\n slot: 'cost',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '原价',\r\n slot: 'ot_price',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '库存',\r\n slot: 'stock',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '商品编号',\r\n slot: 'bar_code',\r\n align: 'center',\r\n minWidth: 120,\r\n },\r\n {\r\n title: '虚拟商品',\r\n slot: 'fictitious',\r\n align: 'center',\r\n minWidth: 95,\r\n },\r\n {\r\n title: '操作',\r\n slot: 'action',\r\n fixed: 'right',\r\n align: 'center',\r\n minWidth: 140,\r\n },\r\n ],\r\n columns: [],\r\n columnsInstall: [],\r\n columnsInstal2: [],\r\n gridPic: {\r\n xl: 6,\r\n lg: 8,\r\n md: 12,\r\n sm: 12,\r\n xs: 12,\r\n },\r\n gridBtn: {\r\n xl: 4,\r\n lg: 8,\r\n md: 8,\r\n sm: 8,\r\n xs: 8,\r\n },\r\n //自定义留言下拉选择\r\n CustomList: [\r\n {\r\n value: 'text',\r\n label: '文本框',\r\n },\r\n {\r\n value: 'number',\r\n label: '数字',\r\n },\r\n {\r\n value: 'email',\r\n label: '邮件',\r\n },\r\n {\r\n value: 'data',\r\n label: '日期',\r\n },\r\n {\r\n value: 'time',\r\n label: '时间',\r\n },\r\n {\r\n value: 'id',\r\n label: '身份证',\r\n },\r\n {\r\n value: 'phone',\r\n label: '手机号',\r\n },\r\n {\r\n value: 'img',\r\n label: '图片',\r\n },\r\n ],\r\n customess: {\r\n content: [],\r\n }, //自定义留言内容\r\n\r\n formValidate: {\r\n disk_info: '', //卡密类型\r\n logistics: ['1'], //选择物流方式\r\n freight: 2, //运费设置\r\n postage: 0, //设置运费金额\r\n recommend: [], //商品推荐\r\n presale_day: 1, //预售发货时间-结束\r\n presale: false, //预售商品开关\r\n is_limit: false,\r\n limit_type: 0,\r\n limit_num: 0,\r\n video_open: false, //视频按钮是否显示\r\n vip_product: false, //付费会员专属开关\r\n custom_form: [], //自定义留言\r\n store_name: '',\r\n cate_id: [],\r\n label_id: [],\r\n keyword: '',\r\n unit_name: '',\r\n store_info: '',\r\n image: '',\r\n recommend_image: '',\r\n slider_image: [],\r\n description: '',\r\n ficti: 0,\r\n give_integral: 0,\r\n sort: 0,\r\n is_show: 1,\r\n is_hot: 0,\r\n is_benefit: 0,\r\n is_best: 0,\r\n is_new: 0,\r\n is_good: 0,\r\n is_postage: 0,\r\n is_sub: [],\r\n recommend_list: [],\r\n virtual_type: 0,\r\n // is_sub: 0,\r\n id: 0,\r\n spec_type: 0,\r\n is_virtual: 0,\r\n video_link: '',\r\n // postage: 0,\r\n temp_id: '',\r\n attrs: [],\r\n items: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n },\r\n ],\r\n activity: ['默认', '秒杀', '砍价', '拼团'],\r\n couponName: [],\r\n header: [],\r\n selectRule: '',\r\n coupon_ids: [],\r\n command_word: '',\r\n },\r\n ruleList: [],\r\n templateList: [],\r\n createBnt: true,\r\n showIput: false,\r\n manyFormValidate: [],\r\n // 单规格表格data\r\n oneFormValidate: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ],\r\n images: [],\r\n imagesTable: '',\r\n currentTab: '1',\r\n isChoice: '',\r\n grid: {\r\n xl: 8,\r\n lg: 8,\r\n md: 12,\r\n sm: 24,\r\n xs: 24,\r\n },\r\n loading: false,\r\n modalPic: false,\r\n addVirtualModel: false,\r\n template: false,\r\n uploadList: [],\r\n treeSelect: [],\r\n picTit: '',\r\n tableIndex: 0,\r\n ruleValidate: {\r\n store_name: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],\r\n cate_id: [\r\n {\r\n required: true,\r\n message: '请选择商品分类',\r\n trigger: 'change',\r\n type: 'array',\r\n min: '1',\r\n },\r\n ],\r\n unit_name: [{ required: true, message: '请输入单位', trigger: 'blur' }],\r\n // image: [{ required: true, message: \"请上传商品图\", trigger: \"change\" }],\r\n slider_image: [\r\n {\r\n required: true,\r\n message: '请上传商品轮播图',\r\n type: 'array',\r\n trigger: 'change',\r\n },\r\n ],\r\n spec_type: [{ required: true, message: '请选择商品规格', trigger: 'change' }],\r\n is_virtual: [{ required: true, message: '请选择商品类型', trigger: 'change' }],\r\n selectRule: [{ required: true, message: '请选择商品规格属性', trigger: 'change' }],\r\n temp_id: [\r\n {\r\n required: true,\r\n message: '请选择运费模板',\r\n trigger: 'change',\r\n type: 'number',\r\n },\r\n ],\r\n presale_time: [\r\n {\r\n required: true,\r\n type: 'array',\r\n message: '请选择活动时间',\r\n trigger: 'change',\r\n },\r\n ],\r\n logistics: [\r\n {\r\n required: true,\r\n type: 'array',\r\n min: 1,\r\n message: '请选择物流方式',\r\n trigger: 'change',\r\n },\r\n {\r\n type: 'array',\r\n max: 2,\r\n message: '请选择物流方式',\r\n trigger: 'change',\r\n },\r\n ],\r\n give_integral: [{ type: 'integer', message: '请输入整数' }],\r\n },\r\n manyBrokerage: 0,\r\n manyBrokerageTwo: 0,\r\n manyVipPrice: 0,\r\n upload: {\r\n videoIng: false, // 是否显示进度条;\r\n },\r\n videoIng: false, // 是否显示进度条;\r\n progress: 0, // 进度条默认0\r\n stock: 0,\r\n disk_info: '',\r\n videoLink: '',\r\n attrs: [],\r\n activity: { 默认: 'red', 秒杀: 'blue', 砍价: 'green', 拼团: 'yellow' },\r\n couponName: [],\r\n updateIds: [],\r\n updateName: [],\r\n couponIds: '',\r\n couponNames: [],\r\n rakeBack: [\r\n {\r\n title: '一级返佣',\r\n slot: 'brokerage',\r\n align: 'center',\r\n width: 95,\r\n },\r\n {\r\n title: '二级返佣',\r\n slot: 'brokerage_two',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n member: [\r\n {\r\n title: '会员价',\r\n slot: 'vip_price',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n columnsInstalM: [],\r\n moveIndex: '',\r\n // aa: [],\r\n // openSubimit: false\r\n };\r\n },\r\n computed: {\r\n ...mapState('media', ['isMobile']),\r\n labelWidth() {\r\n return this.isMobile ? undefined : 120;\r\n },\r\n labelPosition() {\r\n return this.isMobile ? 'top' : 'right';\r\n },\r\n labelBottom() {\r\n return this.isMobile ? undefined : 15;\r\n },\r\n },\r\n created() {\r\n this.columns = this.columns2.slice(0, 8);\r\n this.getToken();\r\n\r\n // this.columnsInstall = this.columns2.slice(0, 4).concat(this.columnsInstall);\r\n // this.columnsInsta8 = this.columns2.slice(0, 4).concat(this.columnsInsta8);\r\n },\r\n mounted() {\r\n if (this.$route.params.id !== '0' && this.$route.params.id) {\r\n this.getInfo();\r\n } else if (this.$route.params.id === '0') {\r\n productCache()\r\n .then((res) => {\r\n let data = res.data.info;\r\n if (!Array.isArray(data)) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n // let names = [];\r\n if (data.coupons) {\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n // names.push(item.title);\r\n });\r\n this.couponName = data.coupons;\r\n }\r\n\r\n this.formValidate = data;\r\n // this.couponName = data.coupons;\r\n // that.couponName = names;\r\n this.dataLabel = data.label_id;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.updateName = data.coupons;\r\n this.formValidate.cate_id = cate_id;\r\n // this.formValidate.label_id = label_id;\r\n this.oneFormValidate = data.attrs;\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.header = [];\r\n this.generate(0);\r\n this.manyFormValidate = data.attrs;\r\n this.spec_type = data.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = true;\r\n }\r\n this.virtualbtn(data.virtual_type, 1);\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: data.image,\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n }\r\n this.spinShow = false;\r\n }\r\n })\r\n .catch((err) => {\r\n this.$Message.error(err.msg);\r\n });\r\n }\r\n if (this.$route.query.type) {\r\n this.modals = true;\r\n this.type = this.$route.query.type;\r\n } else {\r\n this.type = 0;\r\n }\r\n this.goodsCategory();\r\n this.productGetRule();\r\n this.productGetTemplate();\r\n // this.userLabel();\r\n this.uploadType();\r\n },\r\n methods: {\r\n // 分片上传\r\n videoSaveToUrl(file) {\r\n uploadByPieces({\r\n file: file, // 视频实体\r\n pieceSize: 3, // 分片大小\r\n success: (data) => {\r\n this.formValidate.video_link = data.file_path;\r\n this.progress = 100;\r\n },\r\n error: (e) => {\r\n this.$Message.error(e.msg);\r\n },\r\n uploading: (chunk, allChunk) => {\r\n this.videoIng = true;\r\n let st = Math.floor((chunk / allChunk) * 100);\r\n this.progress = st;\r\n },\r\n });\r\n return false;\r\n },\r\n // 类型选择/填入内容判断\r\n virtualbtn(index, type) {\r\n if (type != 1) {\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$Message.error(res.msg);\r\n });\r\n }\r\n }\r\n switch (index) {\r\n case 0:\r\n this.formValidate.virtual_type = 0;\r\n this.formValidate.is_virtual = 0;\r\n this.headTab = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '营销设置', name: '5' },\r\n { tit: '其他设置', name: '6' },\r\n ];\r\n break;\r\n case 1:\r\n this.formValidate.virtual_type = 1;\r\n this.formValidate.postage = 0;\r\n this.headTab = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n // { tit: \"物流设置\", name: \"4\" },\r\n { tit: '营销设置', name: '4' },\r\n { tit: '其他设置', name: '5' },\r\n ];\r\n break;\r\n case 2:\r\n this.formValidate.virtual_type = 2;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n // { tit: \"物流设置\", name: \"4\" },\r\n { tit: '营销设置', name: '4' },\r\n { tit: '其他设置', name: '5' },\r\n ];\r\n break;\r\n case 3:\r\n this.formValidate.virtual_type = 3;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n // { tit: \"物流设置\", name: \"4\" },\r\n { tit: '营销设置', name: '4' },\r\n { tit: '其他设置', name: '5' },\r\n ];\r\n break;\r\n case 1:\r\n this.formValidate.virtual_type = 1;\r\n this.formValidate.is_virtual = 1;\r\n // this.formValidate.virtual_type =1;\r\n this.headTab = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '营销设置', name: '4' },\r\n { tit: '其他设置', name: '5' },\r\n ];\r\n }\r\n },\r\n // 新增分类\r\n addCate() {\r\n this.$modalForm(productCreateApi()).then(() => this.goodsCategory());\r\n },\r\n // 物流方式选择\r\n logisticsBtn(e) {\r\n this.formValidate.logistics = e;\r\n },\r\n // 新增标签\r\n addLabel() {\r\n this.$modalForm(userLabelAddApi(0)).then(() => this.userLabel());\r\n },\r\n // 自定义留言 开启关闭\r\n customMessBtn(e) {\r\n if (!e) {\r\n this.formValidate.custom_form = [];\r\n }\r\n },\r\n // 自定义留言 新增表单\r\n addcustom() {\r\n if (this.formValidate.custom_form.length > 9) {\r\n this.$Message.warning('最多添加10条');\r\n } else {\r\n this.formValidate.custom_form.push({\r\n title: '',\r\n label: 'text',\r\n value: '',\r\n status: false,\r\n });\r\n }\r\n },\r\n // 删除\r\n delcustom(index) {\r\n this.formValidate.custom_form.splice(index, 1);\r\n },\r\n // 预售具体日期\r\n onchangeTime(e) {\r\n this.formValidate.presale_time = e;\r\n },\r\n // 商品详情\r\n getEditorContent(data) {\r\n this.content = data;\r\n },\r\n cancel() {\r\n this.$router.push({ path: '/admin/product/product_list' });\r\n },\r\n // 上传头部token\r\n getToken() {\r\n this.header['Authori-zation'] = 'Bearer ' + getCookies('token');\r\n },\r\n // 导入卡密\r\n upFile(res) {\r\n importCard({ file: res.data.src }).then((res) => {\r\n this.virtualList = this.virtualList.concat(res.data);\r\n });\r\n },\r\n //获取视频上传类型\r\n uploadType() {\r\n uploadType().then((res) => {\r\n this.upload_type = res.data.upload_type;\r\n });\r\n },\r\n // 初始化数据展示\r\n infoData(data) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n });\r\n this.formValidate = data;\r\n this.seletVideo = data.seletVideo;\r\n this.contents = data.description;\r\n this.couponName = data.coupons;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.dataLabel = data.label_id;\r\n this.updateName = data.coupons;\r\n this.virtualbtn(data.virtual_type, 1);\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = true;\r\n }\r\n this.formValidate.cate_id = cate_id;\r\n if (data.attr) {\r\n this.oneFormValidate = [data.attr];\r\n }\r\n this.formValidate.header = [];\r\n this.generate(0);\r\n // this.manyFormValidate = data.attrs;\r\n this.$set(this, 'manyFormValidate', data.attrs);\r\n this.spec_type = data.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n }\r\n },\r\n //关闭淘宝弹窗并生成数据;\r\n onClose(data) {\r\n this.modals = false;\r\n this.infoData(data);\r\n },\r\n\r\n checkMove(evt) {\r\n this.moveIndex = evt.draggedContext.index;\r\n },\r\n end() {\r\n this.moveIndex = '';\r\n },\r\n // 单独设置会员设置\r\n checkAllGroupChange(data) {\r\n this.checkAllGroup(data);\r\n },\r\n checkAllGroup(data) {\r\n if (this.formValidate.spec_type === 0) {\r\n if (data.indexOf(0) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, 4).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, 4).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstall = this.columns2.slice(0, 4);\r\n }\r\n if (data.length === 2) {\r\n this.columnsInstall = this.columns2.slice(0, 4).concat(this.rakeBack).concat(this.member);\r\n }\r\n } else {\r\n if (data.indexOf(0) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, 4).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, 4).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, 4);\r\n }\r\n if (data.length === 2) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, 4).concat(this.rakeBack).concat(this.member);\r\n }\r\n }\r\n },\r\n // 添加优惠券\r\n addCoupon() {\r\n this.$refs.couponTemplates.isTemplate = true;\r\n this.$refs.couponTemplates.tableList();\r\n },\r\n // 规格中优惠券查看\r\n see(data, name, index) {\r\n this.tabName = name;\r\n this.tabIndex = index;\r\n\r\n if (this.formValidate.virtual_type === 1) {\r\n if (data.disk_info != '') {\r\n this.disk_type = 1;\r\n this.disk_info = data.disk_info;\r\n this.stock = data.stock;\r\n } else if (data.virtual_list.length) {\r\n this.disk_type = 2;\r\n this.virtualList = data.virtual_list;\r\n }\r\n this.addVirtualModel = true;\r\n } else {\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n }\r\n },\r\n // 添加优惠券\r\n addGoodsCoupon(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n },\r\n addVirtual(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.addVirtualModel = true;\r\n },\r\n // 提交卡密信息\r\n upVirtual() {\r\n if (this.disk_type == 2) {\r\n for (let i = 0; i < this.virtualList.length; i++) {\r\n const element = this.virtualList[i];\r\n if (!element.value) {\r\n this.$Message.error('请输入所有卡密');\r\n return;\r\n }\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', this.virtualList);\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', this.virtualList.length);\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', '');\r\n } else {\r\n if (!this.disk_info.length) {\r\n return this.$Message.error('请填写卡密信息');\r\n }\r\n if (!this.stock) {\r\n return this.$Message.error('请填写库存数量');\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', this.disk_info);\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', []);\r\n }\r\n this.addVirtualModel = false;\r\n this.closeVirtual();\r\n },\r\n // 初始化卡密数据信息\r\n closeVirtual() {\r\n this.addVirtualModel = false;\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.disk_info = '';\r\n this.stock = 0;\r\n },\r\n //对象数组去重;\r\n unique(arr) {\r\n const res = new Map();\r\n return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1));\r\n },\r\n // 获取优惠券id数据\r\n nameId(id, names) {\r\n this.formValidate.coupon_ids = id;\r\n this.couponName = this.unique(names);\r\n },\r\n // 获取优惠券信息\r\n goodsCouponId(data) {\r\n // this[this.tabName][this.tabIndex].coupon_id = data.id;\r\n // this[this.tabName][this.tabIndex].coupon_name = data.title;\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_id', data.id);\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_name', data.title);\r\n this.$refs.goodsCoupon.isTemplate = false;\r\n },\r\n handleClose(name) {\r\n let index = this.couponName.indexOf(name);\r\n this.couponName.splice(index, 1);\r\n let couponIds = this.formValidate.coupon_ids;\r\n couponIds.splice(index, 1);\r\n this.updateIds = couponIds;\r\n this.updateName = this.couponName;\r\n },\r\n // 运费模板\r\n getList() {\r\n this.productGetTemplate();\r\n },\r\n // 添加运费模板\r\n addTemp() {\r\n this.$refs.templates.isTemplate = true;\r\n },\r\n // 删除视频;\r\n delVideo() {\r\n let that = this;\r\n that.$set(that.formValidate, 'video_link', '');\r\n that.$set(that, 'progress', 0);\r\n that.videoIng = false;\r\n that.upload.videoIng = false;\r\n },\r\n zh_uploadFile() {\r\n if (this.seletVideo == 1) {\r\n this.formValidate.video_link = this.videoLink;\r\n } else {\r\n this.$refs.refid.click();\r\n }\r\n },\r\n // 上传视频\r\n zh_uploadFile_change(evfile) {\r\n let that = this;\r\n let suffix = evfile.target.files[0].name.substr(evfile.target.files[0].name.indexOf('.'));\r\n if (suffix.indexOf('.mp4') === -1) {\r\n return that.$Message.error('只能上传MP4文件');\r\n }\r\n productGetTempKeysApi()\r\n .then((res) => {\r\n console.log(res, '??');\r\n that.$videoCloud\r\n .videoUpload({\r\n type: res.data.type,\r\n evfile: evfile,\r\n res: res,\r\n uploading(status, progress) {\r\n that.upload.videoIng = status;\r\n if (res.status == 200) {\r\n that.progress = 100;\r\n }\r\n },\r\n })\r\n .then((res) => {\r\n that.formValidate.video_link = res.url;\r\n that.$Message.success('视频上传成功');\r\n that.upload.videoIng = false;\r\n })\r\n .catch((res) => {\r\n that.$Message.error(res);\r\n });\r\n })\r\n .catch((res) => {\r\n that.$Message.error(res.msg);\r\n });\r\n },\r\n // 上一页;\r\n upTab() {\r\n this.currentTab = (Number(this.currentTab) - 1).toString();\r\n },\r\n // 下一页;\r\n downTab() {\r\n this.currentTab = (Number(this.currentTab) + 1).toString();\r\n },\r\n // 属性弹窗回调函数;\r\n userSearchs() {\r\n this.productGetRule();\r\n },\r\n // 添加规则;\r\n addRule() {\r\n this.$refs.addattr.modal = true;\r\n },\r\n // 批量设置分佣;\r\n brokerageSetUp() {\r\n let that = this;\r\n if (that.formValidate.is_sub.indexOf(1) > -1) {\r\n if (that.manyBrokerage <= 0 || that.manyBrokerageTwo <= 0) {\r\n return that.$Message.error('请填写返佣金额后进行批量添加');\r\n }\r\n } else if (that.formValidate.is_sub.indexOf(0) > -1) {\r\n if (that.manyVipPrice <= 0) {\r\n return that.$Message.error('请填写会员价后进行批量添加');\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n if (that.manyBrokerage <= 0 || that.manyBrokerageTwo <= 0 || that.manyVipPrice <= 0) {\r\n return that.$Message.error('请填写完金额后进行批量添加');\r\n }\r\n }\r\n for (let val of that.manyFormValidate) {\r\n this.$set(val, 'brokerage', that.manyBrokerage);\r\n this.$set(val, 'brokerage_two', that.manyBrokerageTwo);\r\n this.$set(val, 'vip_price', that.manyVipPrice);\r\n }\r\n },\r\n // 批量设置会员价\r\n vipPriceSetUp() {\r\n let that = this;\r\n if (that.manyVipPrice <= 0) {\r\n return that.$Message.error('请填写会员价在进行批量添加');\r\n } else {\r\n for (let val of that.manyFormValidate) {\r\n this.$set(val, 'vip_price', that.manyVipPrice);\r\n }\r\n }\r\n },\r\n // 新增卡密\r\n handleAdd() {\r\n this.virtualList.push({\r\n key: '',\r\n value: '',\r\n });\r\n },\r\n // 初始化卡密信息\r\n initVirtualData(status) {\r\n if (!status) {\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n }\r\n },\r\n removeVirtual(index) {\r\n this.virtualList.splice(index, 1);\r\n },\r\n // 清空批量规格信息\r\n batchDel() {\r\n this.oneFormBatch = [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n weight: 0,\r\n volume: 0,\r\n },\r\n ];\r\n },\r\n confirm() {\r\n let that = this;\r\n that.createBnt = true;\r\n if (that.formValidate.selectRule.trim().length <= 0) {\r\n return that.$Message.error('请选择属性');\r\n }\r\n that.ruleList.forEach(function (item, index) {\r\n if (item.rule_name === that.formValidate.selectRule) {\r\n that.attrs = item.rule_value;\r\n }\r\n });\r\n },\r\n // 获取商品属性模板;\r\n productGetRule() {\r\n productGetRuleApi().then((res) => {\r\n this.ruleList = res.data;\r\n });\r\n },\r\n // 获取运费模板;\r\n productGetTemplate() {\r\n productGetTemplateApi().then((res) => {\r\n this.templateList = res.data;\r\n });\r\n },\r\n // 删除表格中的属性\r\n delAttrTable(index) {\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {\r\n this.manyFormValidate.splice(index, 1);\r\n this.$Message.success(res.msg);\r\n })\r\n .catch((res) => {\r\n this.$Message.error(res.msg);\r\n });\r\n } else {\r\n this.manyFormValidate.splice(index, 1);\r\n }\r\n },\r\n // 批量添加\r\n batchAdd() {\r\n for (let val of this.manyFormValidate) {\r\n if (this.oneFormBatch[0].pic) {\r\n this.$set(val, 'pic', this.oneFormBatch[0].pic);\r\n }\r\n if (this.oneFormBatch[0].price > 0) {\r\n this.$set(val, 'price', this.oneFormBatch[0].price);\r\n }\r\n if (this.oneFormBatch[0].cost > 0) {\r\n this.$set(val, 'cost', this.oneFormBatch[0].cost);\r\n }\r\n if (this.oneFormBatch[0].ot_price > 0) {\r\n this.$set(val, 'ot_price', this.oneFormBatch[0].ot_price);\r\n }\r\n if (this.oneFormBatch[0].stock > 0) {\r\n this.$set(val, 'stock', this.oneFormBatch[0].stock);\r\n }\r\n if (this.oneFormBatch[0].bar_code !== '') {\r\n this.$set(val, 'bar_code', this.oneFormBatch[0].bar_code);\r\n }\r\n if (this.oneFormBatch[0].weight > 0) {\r\n this.$set(val, 'weight', this.oneFormBatch[0].weight);\r\n }\r\n if (this.oneFormBatch[0].volume > 0) {\r\n this.$set(val, 'volume', this.oneFormBatch[0].volume);\r\n }\r\n }\r\n },\r\n // 添加按钮\r\n addBtn() {\r\n this.clearAttr();\r\n this.createBnt = false;\r\n this.showIput = true;\r\n },\r\n // 立即生成\r\n generate(type) {\r\n generateAttrApi(\r\n {\r\n attrs: this.attrs,\r\n is_virtual: [1, 2].includes(this.formValidate.virtual_type) ? 1 : 0,\r\n virtual_type: this.formValidate.virtual_type,\r\n },\r\n this.formValidate.id,\r\n type,\r\n )\r\n .then((res) => {\r\n let info = res.data.info,\r\n header1 = JSON.parse(JSON.stringify(info.header));\r\n if (this.$route.params.id !== '0' && (this.$route.query.type != -1 || type)) {\r\n this.manyFormValidate = info.value;\r\n }\r\n let header = info.header;\r\n if ([1, 2].includes(this.formValidate.virtual_type)) {\r\n this.columnsInstalM = header;\r\n this.formValidate.header = header;\r\n } else {\r\n this.formValidate.header = header1;\r\n this.columnsInstalM = info.header;\r\n }\r\n this.checkAllGroup(this.formValidate.is_sub);\r\n if (!this.$route.params.id && this.formValidate.spec_type === 1) {\r\n this.manyFormValidate.map((item) => {\r\n item.pic = this.formValidate.image;\r\n });\r\n this.oneFormBatch[0].pic = this.formValidate.image;\r\n } else if (this.$route.params.id) {\r\n this.manyFormValidate.map((item) => {\r\n if (!item.pic) {\r\n item.pic = this.formValidate.image;\r\n }\r\n });\r\n this.oneFormBatch[0].pic = this.formValidate.image;\r\n }\r\n })\r\n .catch((res) => {\r\n this.$Message.error(res.msg);\r\n });\r\n },\r\n // 取消\r\n offAttrName() {\r\n this.showIput = false;\r\n this.createBnt = true;\r\n },\r\n clearAttr() {\r\n this.formDynamic.attrsName = '';\r\n this.formDynamic.attrsVal = '';\r\n },\r\n // 删除规格\r\n handleRemoveRole(index) {\r\n this.attrs.splice(index, 1);\r\n this.manyFormValidate.splice(index, 1);\r\n },\r\n // 删除属性\r\n handleRemove2(item, index) {\r\n item.splice(index, 1);\r\n },\r\n // 添加规则名称\r\n createAttrName() {\r\n if (this.formDynamic.attrsName && this.formDynamic.attrsVal) {\r\n let data = {\r\n value: this.formDynamic.attrsName,\r\n detail: [this.formDynamic.attrsVal],\r\n };\r\n this.attrs.push(data);\r\n var hash = {};\r\n this.attrs = this.attrs.reduce(function (item, next) {\r\n /* eslint-disable */\r\n hash[next.value] ? '' : (hash[next.value] = true && item.push(next));\r\n return item;\r\n }, []);\r\n this.clearAttr();\r\n this.showIput = false;\r\n this.createBnt = true;\r\n } else {\r\n this.$Message.warning('请添加完整的规格!');\r\n }\r\n },\r\n // 添加属性\r\n createAttr(num, idx) {\r\n if (num) {\r\n this.attrs[idx].detail.push(num);\r\n var hash = {};\r\n this.attrs[idx].detail = this.attrs[idx].detail.reduce(function (item, next) {\r\n /* eslint-disable */\r\n hash[next] ? '' : (hash[next] = true && item.push(next));\r\n return item;\r\n }, []);\r\n } else {\r\n this.$Message.warning('请添加属性');\r\n }\r\n },\r\n // 商品分类;\r\n goodsCategory() {\r\n treeListApi(1)\r\n .then((res) => {\r\n this.treeSelect = res.data;\r\n })\r\n .catch((res) => {\r\n this.$Message.error(res.msg);\r\n });\r\n },\r\n //视视上传类型\r\n changeVideo(e) {\r\n this.formValidate.video_link = '';\r\n this.videoLink = '';\r\n },\r\n // 改变规格\r\n changeSpec() {\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$Message.error(res.msg);\r\n });\r\n }\r\n },\r\n // 详情\r\n getInfo() {\r\n let that = this;\r\n that.spinShow = true;\r\n productInfoApi(that.$route.params.id)\r\n .then(async (res) => {\r\n let data = res.data.productInfo;\r\n this.infoData(data);\r\n this.spinShow = false;\r\n })\r\n .catch((res) => {\r\n this.spinShow = false;\r\n this.$Message.error(res.msg);\r\n });\r\n },\r\n // tab切换\r\n onhangeTab(name) {\r\n this.currentTab = name;\r\n },\r\n handleRemove(i) {\r\n this.images.splice(i, 1);\r\n this.formValidate.slider_image.splice(i, 1);\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n },\r\n // 关闭图片上传模态框\r\n changeCancel(msg) {\r\n this.modalPic = false;\r\n },\r\n // 点击商品图\r\n modalPicTap(tit, picTit, index) {\r\n this.modalPic = true;\r\n this.isChoice = tit === 'dan' ? '单选' : '多选';\r\n this.picTit = picTit;\r\n this.tableIndex = index;\r\n },\r\n // 获取单张图片信息\r\n getPic(pc) {\r\n switch (this.picTit) {\r\n case 'danFrom':\r\n this.formValidate.image = pc.att_dir;\r\n if (!this.$route.params.id) {\r\n if (this.formValidate.spec_type === 0) {\r\n this.oneFormValidate[0].pic = pc.att_dir;\r\n } else {\r\n this.manyFormValidate.map((item) => {\r\n item.pic = pc.att_dir;\r\n });\r\n this.oneFormBatch[0].pic = pc.att_dir;\r\n }\r\n }\r\n break;\r\n case 'danTable':\r\n this.oneFormValidate[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'duopi':\r\n this.oneFormBatch[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'recommend_image':\r\n this.formValidate.recommend_image = pc.att_dir;\r\n break;\r\n default:\r\n this.manyFormValidate[this.tableIndex].pic = pc.att_dir;\r\n }\r\n this.modalPic = false;\r\n },\r\n // 获取多张图信息\r\n getPicD(pc) {\r\n this.images = pc;\r\n this.images.map((item) => {\r\n this.formValidate.slider_image.push(item.att_dir);\r\n this.formValidate.slider_image = this.formValidate.slider_image.splice(0, 10);\r\n });\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n this.modalPic = false;\r\n },\r\n // 提交\r\n handleSubmit(name) {\r\n this.$refs[name].validate((valid) => {\r\n if (valid) {\r\n this.formValidate.type = this.type;\r\n if (this.formValidate.spec_type === 0) {\r\n this.formValidate.attrs = this.oneFormValidate;\r\n this.formValidate.header = [];\r\n this.formValidate.items = [];\r\n this.formValidate.is_copy = 0;\r\n } else {\r\n this.formValidate.items = this.attrs;\r\n this.formValidate.attrs = this.manyFormValidate;\r\n this.formValidate.is_copy = 1;\r\n }\r\n if (this.formValidate.spec_type === 1 && this.manyFormValidate.length === 0) {\r\n return this.$Message.warning('商品信息-请点击生成多规格');\r\n // return this.$Message.warning('请点击生成规格!');\r\n }\r\n let item = this.formValidate.attrs;\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].stock > 1000000) {\r\n return this.$Message.error('规格库存-库存超出系统范围(1000000)');\r\n }\r\n }\r\n if (this.formValidate.is_sub[0] === 1) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null) {\r\n return this.$Message.error('营销设置- 一二级返佣不能为空');\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].vip_price === null) {\r\n return this.$Message.error('营销设置-会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null || item[i].vip_price === null) {\r\n return this.$Message.error('营销设置- 一二级返佣和会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.freight == 3 && !this.formValidate.temp_id) {\r\n return this.$Message.warning('商品信息-运费模板不能为空');\r\n }\r\n let activeIds = [];\r\n this.dataLabel.forEach((item) => {\r\n activeIds.push(item.id);\r\n });\r\n this.formValidate.label_id = activeIds;\r\n this.openSubimit = true;\r\n this.formValidate.description = this.formatRichText(this.content);\r\n productAddApi(this.formValidate)\r\n .then(async (res) => {\r\n this.openSubimit = false;\r\n this.$Message.success(res.msg);\r\n if (this.$route.params.id === '0') {\r\n cacheDelete().catch((err) => {\r\n this.$Message.error(err.msg);\r\n });\r\n }\r\n setTimeout(() => {\r\n this.openSubimit = false;\r\n this.$router.push({ path: '/admin/product/product_list' });\r\n }, 500);\r\n })\r\n .catch((res) => {\r\n setTimeout((e) => {\r\n this.openSubimit = false;\r\n }, 1000);\r\n this.$Message.error(res.msg);\r\n });\r\n } else {\r\n if (!this.formValidate.store_name) {\r\n return this.$Message.warning('商品信息-商品名称不能为空');\r\n } else if (!this.formValidate.cate_id.length) {\r\n return this.$Message.warning('商品信息-商品分类不能为空');\r\n } else if (!this.formValidate.unit_name) {\r\n return this.$Message.warning('商品信息-商品单位不能为空');\r\n } else if (!this.formValidate.slider_image.length) {\r\n return this.$Message.warning('商品信息-商品轮播图不能为空');\r\n } else if (!this.formValidate.logistics.length && !this.formValidate.virtual_type) {\r\n return this.$Message.warning('物流设置-至少选择一种物流方式');\r\n } else if (!this.formValidate.temp_id && this.formValidate.freight == 3) {\r\n return this.$Message.warning('商品信息-运费模板不能为空');\r\n }\r\n }\r\n });\r\n },\r\n changeTemplate(msg) {\r\n this.template = msg;\r\n },\r\n // 表单验证\r\n validate(prop, status, error) {\r\n if (status === false) {\r\n this.$Message.warning(error);\r\n }\r\n },\r\n // 移动\r\n handleDragStart(e, item) {\r\n this.dragging = item;\r\n },\r\n handleDragEnd(e, item) {\r\n this.dragging = null;\r\n },\r\n handleDragOver(e) {\r\n e.dataTransfer.dropEffect = 'move';\r\n },\r\n handleDragEnter(e, item) {\r\n e.dataTransfer.effectAllowed = 'move';\r\n if (item === this.dragging) {\r\n return;\r\n }\r\n const newItems = [...this.formValidate.slider_image];\r\n const src = newItems.indexOf(this.dragging);\r\n const dst = newItems.indexOf(item);\r\n newItems.splice(dst, 0, ...newItems.splice(src, 1));\r\n this.formValidate.slider_image = newItems;\r\n },\r\n // 过滤详情内容\r\n formatRichText(html) {\r\n let newContent = html.replace(/<img[^>]*>/gi, function (match, capture) {\r\n match = match.replace(/style=\"[^\"]+\"/gi, '').replace(/style='[^']+'/gi, '');\r\n match = match.replace(/width=\"[^\"]+\"/gi, '').replace(/width='[^']+'/gi, '');\r\n match = match.replace(/height=\"[^\"]+\"/gi, '').replace(/height='[^']+'/gi, '');\r\n return match;\r\n });\r\n newContent = newContent.replace(/style=\"[^\"]+\"/gi, function (match, capture) {\r\n match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi, 'max-width:100%;');\r\n return match;\r\n });\r\n newContent = newContent.replace(/<br[^>]*\\/>/gi, '');\r\n newContent = newContent.replace(\r\n /\\<img/gi,\r\n '<img style=\"max-width:100%;height:auto;display:block;margin-top:0;margin-bottom:0;\"',\r\n );\r\n return newContent;\r\n },\r\n // 商品id\r\n getProductId(row) {\r\n this.goods_modals = false;\r\n let arr = this.formValidate.recommend_list.concat(row);\r\n this.formValidate.recommend_list = this.uniques(arr);\r\n },\r\n // 选择推荐商品\r\n changeGoods() {\r\n this.goods_modals = true;\r\n this.$refs.goodslist.getList();\r\n this.$refs.goodslist.goodsCategory();\r\n },\r\n // 选择用户标签\r\n activeData(dataLabel) {\r\n this.labelShow = false;\r\n this.dataLabel = dataLabel;\r\n },\r\n // 标签弹窗关闭\r\n labelClose() {\r\n this.labelShow = false;\r\n },\r\n // 删除用户标签\r\n closeLabel(label) {\r\n let index = this.dataLabel.indexOf(this.dataLabel.filter((d) => d.id == label.id)[0]);\r\n this.dataLabel.splice(index, 1);\r\n },\r\n // 打开选择用户标签\r\n openLabel(row) {\r\n this.labelShow = true;\r\n this.$refs.userLabel.userLabel(JSON.parse(JSON.stringify(this.dataLabel)));\r\n },\r\n uniques(songs) {\r\n let result = {};\r\n let finalResult = [];\r\n for (let i = 0; i < songs.length; i++) {\r\n result[songs[i].product_id] = songs[i];\r\n }\r\n for (let item in result) {\r\n finalResult.push(result[item]);\r\n }\r\n return finalResult;\r\n },\r\n handleRemoveRecommend(i) {\r\n this.formValidate.recommend_list.splice(i, 1);\r\n },\r\n },\r\n};\r\n</script>\r\n<style scoped lang=\"stylus\">\r\n.list-group {\r\n margin-left: -8px;\r\n}\r\n\r\n.borderStyle {\r\n border: 1px solid #ccc;\r\n padding: 8px;\r\n border-radius: 4px;\r\n}\r\n\r\n.drag {\r\n cursor: move;\r\n}\r\n\r\n.move-icon {\r\n width: 30px;\r\n cursor: move;\r\n margin-right: 10px;\r\n}\r\n\r\n.move-icon .icondrag2 {\r\n font-size: 26px;\r\n color: #d8d8d8;\r\n}\r\n\r\n.maxW /deep/.ivu-select-dropdown {\r\n max-width: 600px;\r\n}\r\n\r\n#shopp-manager .ivu-table-wrapper {\r\n border-left: 1px solid #dcdee2;\r\n border-top: 1px solid #dcdee2;\r\n}\r\n\r\n.noLeft {\r\n >>> .ivu-form-item-content {\r\n margin-left: 0 !important;\r\n }\r\n}\r\n\r\n#shopp-manager .ivu-form-item {\r\n position: relative;\r\n}\r\n\r\n#shopp-manager .ivu-form-item .tips {\r\n position: absolute;\r\n color: #999;\r\n top: 29px;\r\n left: -77px;\r\n font-size: 12px;\r\n}\r\n\r\n.iview-video-style {\r\n width: 40%;\r\n height: 180px;\r\n border-radius: 10px;\r\n background-color: #707070;\r\n margin-top: 10px;\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.iview-video-style .iconv {\r\n color: #fff;\r\n line-height: 180px;\r\n width: 50px;\r\n height: 50px;\r\n display: inherit;\r\n font-size: 26px;\r\n position: absolute;\r\n top: -74px;\r\n left: 50%;\r\n margin-left: -25px;\r\n}\r\n\r\n.iview-video-style .mark {\r\n position: absolute;\r\n width: 100%;\r\n height: 30px;\r\n top: 0;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n text-align: center;\r\n}\r\n\r\n.submission {\r\n margin-left: 10px;\r\n}\r\n\r\n.color-list .tip {\r\n color: #c9c9c9;\r\n}\r\n\r\n.color-list .color-item {\r\n height: 30px;\r\n line-height: 30px;\r\n padding: 0 10px;\r\n color: #fff;\r\n margin-right: 10px;\r\n}\r\n\r\n.color-list .color-item.blue {\r\n background-color: #1E9FFF;\r\n}\r\n\r\n.color-list .color-item.yellow {\r\n background-color: rgb(254, 185, 0);\r\n}\r\n\r\n.color-list .color-item.green {\r\n background-color: #009688;\r\n}\r\n\r\n.color-list .color-item.red {\r\n background-color: #ed4014;\r\n}\r\n\r\n.columnsBox {\r\n margin-right: 10px;\r\n}\r\n\r\n.priceBox {\r\n width: 100%;\r\n}\r\n\r\n.rulesBox {\r\n display: flex;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.pictrueBox {\r\n display: inline-block;\r\n}\r\n\r\n.pictrueTab {\r\n width: 40px !important;\r\n height: 40px !important;\r\n}\r\n\r\n.pictrue {\r\n width: 60px;\r\n height: 60px;\r\n border: 1px dotted rgba(0, 0, 0, 0.1);\r\n margin-right: 15px;\r\n display: inline-block;\r\n position: relative;\r\n cursor: pointer;\r\n\r\n img {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .btndel {\r\n position: absolute;\r\n z-index: 1;\r\n width: 20px !important;\r\n height: 20px !important;\r\n left: 46px;\r\n top: -4px;\r\n }\r\n}\r\n\r\n.upLoad {\r\n width: 58px;\r\n height: 58px;\r\n line-height: 58px;\r\n border: 1px dotted rgba(0, 0, 0, 0.1);\r\n border-radius: 4px;\r\n background: rgba(0, 0, 0, 0.02);\r\n cursor: pointer;\r\n}\r\n\r\n.curs {\r\n cursor: pointer;\r\n}\r\n\r\n.inpWith {\r\n width: 60%;\r\n}\r\n\r\n.labeltop {\r\n >>> .ivu-form-item-label {\r\n float: none !important;\r\n display: inline-block !important;\r\n margin-left: 120px !important;\r\n width: auto !important;\r\n }\r\n}\r\n\r\n.video-icon {\r\n background-image: url('https://cdn.oss.9gt.net/prov1.1/1/icons.png'); // cdn.oss.9gt.net/prov1.1/1/icons.png);\r\n background-color: #fff;\r\n background-position: -9999px;\r\n background-repeat: no-repeat;\r\n}\r\n\r\n.see {\r\n color: #2d8cf0;\r\n cursor: pointer;\r\n}\r\n\r\n.trip {\r\n color: #bbb;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.virtual-data {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.add-more {\r\n margin-top: 20px;\r\n display: flex;\r\n}\r\n\r\n.virtual-title {\r\n width: 50px;\r\n}\r\n\r\n.scroll-virtual {\r\n max-height: 400px;\r\n overflow-y: auto;\r\n margin-top: 10px;\r\n}\r\n\r\n.footer {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-top: 30px;\r\n\r\n .clear, .submit {\r\n padding: 10px 20px;\r\n border-radius: 5px;\r\n color: #fff;\r\n cursor: pointer;\r\n }\r\n\r\n .clear {\r\n background-color: #ccc;\r\n margin-right: 20px;\r\n }\r\n\r\n .submit {\r\n background-color: #2d8cf0;\r\n }\r\n}\r\n\r\n.picBox {\r\n display: flex;\r\n}\r\n\r\n.btndel {\r\n position: absolute;\r\n z-index: 9;\r\n width: 20px !important;\r\n height: 20px !important;\r\n left: 46px;\r\n top: -4px;\r\n}\r\n\r\n.ifam {\r\n width: 344px;\r\n height: 644px;\r\n background: url('../../../assets/images/phonebg.png') no-repeat center top;\r\n background-size: 344px 644px;\r\n padding: 40px 20px;\r\n padding-top: 50px;\r\n margin: 0 auto;\r\n\r\n .content {\r\n height: 560px;\r\n overflow: hidden;\r\n scrollbar-width: none; /* firefox */\r\n -ms-overflow-style: none; /* IE 10+ */\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n }\r\n\r\n .content::-webkit-scrollbar {\r\n display: none; /* Chrome Safari */\r\n }\r\n}\r\n</style>\r\n<style scoped lang=\"stylus\">\r\n/deep/.ivu-date-picker {\r\n width: 300px;\r\n}\r\n\r\n.virtual_boder {\r\n border: 1px solid #1890FF;\r\n}\r\n\r\n.virtual_boder2 {\r\n border: 1px solid #E7E7E7;\r\n}\r\n\r\n.virtual_san {\r\n position: absolute;\r\n bottom: 0;\r\n right: 0;\r\n width: 0;\r\n height: 0;\r\n border-bottom: 26px solid #1890FF;\r\n border-left: 26px solid transparent;\r\n}\r\n\r\n.virtual_dui {\r\n position: absolute;\r\n bottom: -2px;\r\n right: 2px;\r\n color: #FFFFFF;\r\n font-family: system-ui;\r\n}\r\n\r\n.virtual {\r\n width: 120px;\r\n height: 60px;\r\n background: #FFFFFF;\r\n border-radius: 3px;\r\n // border: 1px solid #E7E7E7;\r\n float: left;\r\n text-align: center;\r\n padding-top: 8px;\r\n position: relative;\r\n cursor: pointer;\r\n line-height: 23px;\r\n\r\n .virtual_top {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: rgba(0, 0, 0, 0.85);\r\n }\r\n\r\n .virtual_bottom {\r\n font-size: 12px;\r\n font-weight: 400;\r\n color: #999999;\r\n }\r\n}\r\n\r\n.virtual:nth-child(2n) {\r\n margin: 0 12px;\r\n}\r\n\r\n.addfont {\r\n display: inline-block;\r\n font-size: 13px;\r\n font-weight: 400;\r\n color: #1890FF;\r\n margin-left: 14px;\r\n cursor: pointer;\r\n}\r\n\r\n.titTip {\r\n display: inline-bolck;\r\n font-size: 12px;\r\n font-weight: 400;\r\n color: #999999;\r\n margin-top: 14px;\r\n}\r\n\r\n.videbox {\r\n width: 60px;\r\n height: 60px;\r\n background: rgba(0, 0, 0, 0.02);\r\n border-radius: 4px;\r\n border: 1px dashed #DDDDDD;\r\n line-height: 50px;\r\n text-align: center;\r\n color: #898989;\r\n font-size: 30px;\r\n font-weight: 400;\r\n cursor: pointer;\r\n}\r\n\r\n.addCustom_content {\r\n margin-top: 20px;\r\n\r\n .custom_box {\r\n margin-bottom: 10px;\r\n }\r\n}\r\n\r\n.addCustomBox {\r\n margin-top: 12px;\r\n font-size: 13px;\r\n font-weight: 400;\r\n color: #1890FF;\r\n\r\n .btn {\r\n cursor: pointer;\r\n width: max-content;\r\n }\r\n}\r\n\r\n.type-radio {\r\n margin-buttom: 10px;\r\n}\r\n\r\n.deteal-btn {\r\n color: #5179ea;\r\n}\r\n\r\n.stock-disk {\r\n margin: 10px 0;\r\n}\r\n\r\n.line {\r\n border-bottom: 1px dashed #eee;\r\n margin-bottom: 20px;\r\n}\r\n\r\n.labelInput {\r\n border: 1px solid #dcdee2;\r\n width: 20%;\r\n padding: 0 5px;\r\n border-radius: 5px;\r\n min-height: 30px;\r\n cursor: pointer;\r\n\r\n .span {\r\n color: #c5c8ce;\r\n }\r\n\r\n .iconxiayi {\r\n font-size: 12px;\r\n }\r\n}\r\n\r\n#shopp-manager /deep/.ivu-form-item-content {\r\n line-height: 33px !important;\r\n}\r\n\r\n#selectvideo /deep/.ivu-form-item-content {\r\n line-height: 0px !important;\r\n}\r\n\r\n.progress {\r\n margin-top: 10px;\r\n}\r\n</style>\r\n"]}]}
|